Created
October 7, 2025 10:48
-
-
Save sunmeat/1ecff4299195ac48a00443bc1917047a to your computer and use it in GitHub Desktop.
явна та неявна реалізація інтерфейсів C#
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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