Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created October 7, 2025 10:48
Show Gist options
  • Save sunmeat/1ecff4299195ac48a00443bc1917047a to your computer and use it in GitHub Desktop.
Save sunmeat/1ecff4299195ac48a00443bc1917047a to your computer and use it in GitHub Desktop.
явна та неявна реалізація інтерфейсів C#
using System.Text;
namespace InterfacesDemo
{
// якщо клас реалізує два інтерфейси, що містять компонент з однаковою
// сигнатурою, то при реалізації цього компонента в класі обидва інтерфейси будуть
// використовувати цей компонент для своєї реалізації. в наступному прикладі
// всі виклики Paint викликають один метод:
interface IControl
{
void Paint();
}
interface ISurface
{
void Paint();
}
class ImplicitSampleClass : IControl, ISurface
{
public void Paint()
{
Console.WriteLine("Метод Paint, задовольняє вимоги обох інтерфейсів :)");
}
}
// однак, якщо компоненти двох інтерфейсів не виконують однакову функцію,
// це може призвести до невірної реалізації одного або обох інтерфейсів.
// можлива явна реалізація компонента інтерфейсу - шляхом створення
// компонента класу, який викликається тільки через інтерфейс і має
// відношення тільки до цього інтерфейсу. це досягається шляхом включення
// в ім'я компонента класу імені інтерфейсу з крапкою. наприклад:
class ExplicitSampleClass : IControl, ISurface
{
void IControl.Paint()
{
Console.WriteLine("IControl.Paint");
}
void ISurface.Paint()
{
Console.WriteLine("ISurface.Paint");
}
// звичайний метод класу, не пов'язаний з інтерфейсами
//void Paint()
//{
// Console.WriteLine("ExplicitSampleClass.Paint");
//}
}
// компонент класу IControl.Paint тепер доступний тільки через інтерфейс
// IControl, а компонент ISurface.Paint — тільки через інтерфейс ISurface.
// кожна реалізація методу є незалежною і недоступна в класі напряму.
class Program
{
static void Main()
{
Console.OutputEncoding = Encoding.UTF8;
// демонстрація неявної реалізації
Console.WriteLine("Неявна реалізація:");
var i = new ImplicitSampleClass();
IControl icon = i;
ISurface isur = i;
i.Paint();
icon.Paint();
isur.Paint();
Console.WriteLine("\nЯвна реалізація:");
ExplicitSampleClass e = new ExplicitSampleClass();
IControl ec = e;
ISurface es = e;
// explicitSc.Paint(); // помилка компілятора.
ec.Paint();
es.Paint();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment