Jawna i niejawna implementacja interfejsu w C#

Interfejs klasy — w obiektowych językach programowania interfejs jest abstrakcyjną reprezentacją klasy pozwalającą na korzystanie z niej niezależnie od faktycznej implementacji. Interfejs pozwala na enkapsulację wielu różnych obiektów utworzonych w oparciu o odmienne klasy, które zawierają implementację wspólnego interfejsu. [wikipedia]
Interfejs dostarcza nam pewną funkcjonalność którą realizują klasy implementujące go, dzięki czemu możemy posługiwać się wyłącznie interfejsem aby zrealizować konkretne zadania bez konieczności zagłębiania się w kod znajdujący się za nimi.

Interfejsy w C#

W języku C# definiując interfejs posługujemy się słowem kluczowym interface, trzeba pamiętać że przy tworzeniu interfejsu nie używamy modyfikatorów dostępu, gdyż wszystkie elementy zawarte w interfejsie są publiczne. W interfejsach tworzymy jedynie definicje wybranych elementów które muszą zaimplementować klasy/struktury je implementujące.

Interfejsy mogą zawierać deklarację:

  • metod
  • właściwości
  • zdarzeń
  • indekserów

Interfejsy nie mogą zawierać stałych, pól, operatorów, konstruktorów, destruktorów i zagnieżdżonych typów. Nie mogą zawierać również statycznych elementów.

Interfejsy mogą dziedziczyć po jednym lub kilku interfejsach. Elementami implementującymi interfejsy są klasy lub struktury (mogą on implementować wiele interfejsów). W języku C# mamy również możliwość tworzenia generycznych interfejsów.

Niejawna implementacja interfejsu

Niejawna implementacja interfejsu jest najbardziej znaną formą implementacji. Polega ona na  zaimplementowaniu publicznych elementów których definicje zawiera interfejs:

[csharp]
interface ISampleInterface1
{
void Print();
string Message { get; }
}
interface ISampleInterface2
{
void Print();
}
class SampleClass : ISampleInterface1, ISampleInterface2
{
// Zarówno ISampleInterface1.Print i ISampleInterface2.Print
// wywołają tą metodę
public void Print()
{
Console.WriteLine("Metoda Print");
}
private string _message = "";
public string Message
{
get { return _message; }
set { _message = value; }
}
}
[/csharp]

Jak widzimy nie ma tu żadnej magi implementujemy w klasie SampleClass metodę Print i właściwość Message z interfejsu ISampleInterface1 do której dopisujemy setter.

Jawna implementacja interfejsu

Aby jawnie zaimplementować interfejs musimy nazwę implementowanego elementu poprzedzić nazwą interfejsu:

[csharp]
class SampleClass : ISampleInterface1, ISampleInterface2
{
void ISampleInterface1.Print()
{
Console.WriteLine("ISampleInterface1.Print");
}

void ISampleInterface2.Print()
{
Console.WriteLine("ISampleInterface2.Print");
}

private string _message = "";
string ISampleInterface1.Message
{
get { return _message; }
}
}
[/csharp]

Dzięki jawnej implementacji mamy możliwość zaimplementowani dwóch metod o tej samej nazwie co czasami może być niezmiernie przydatne. Przy jawnej implementacji trzeba pamiętać, że nie możemy używać modyfikatorów dostępu. Z jawną implementacją wiąże się też kilka niedogodności: implementacje elementów interfejsu nie są widoczne w klasie implementujące, aby uzyskać do nich dostęp musimy posługiwać się konkretny interfejsem. W przypadku właściwości Message nie możemy dopisać settera gdyż dostaniemy błąd kompilacji.

Więcej informacji na temat interfejsów można uzyskać w:
Interfaces (C# Programming Guide), Explicit Interface Implementation, Explicit Interface Implementation Tutorial, Implicit and Explicit Interface Implementations, Design Guideline Update: Explicit Member Implementation, Interface layout, Interface (C# Reference),

315 thoughts on “Jawna i niejawna implementacja interfejsu w C#”

  1. I together with my buddies were actually reading through the good techniques located on your website and then the sudden I got a horrible feeling I had not expressed respect to the website owner for those tips. All of the young men are actually consequently happy to study all of them and already have very much been taking advantage of these things. I appreciate you for truly being well thoughtful and for making a decision on varieties of decent themes most people are really wanting to understand about. Our own honest regret for not expressing appreciation to you sooner.

  2. Good post. I learn one thing tougher on completely different blogs everyday. It would always be stimulating to learn content material from other writers and observe just a little something from their store. I抎 favor to make use of some with the content on my blog whether you don抰 mind. Natually I抣l offer you a link in your net blog. Thanks for sharing.

  3. Thank you so much for giving everyone an extraordinarily brilliant possiblity to read in detail from this website. It really is very superb plus full of a lot of fun for me personally and my office colleagues to search your web site on the least 3 times a week to study the new tips you will have. And lastly, we’re usually fascinated concerning the wonderful creative concepts you give. Some 1 points in this post are indeed the most effective we have had.

  4. It’s awesome to go to see this website and reading the views of all mates about this paragraph,
    while I am also zealous of getting experience.

  5. I抦 impressed, I have to say. Actually not often do I encounter a blog that抯 each educative and entertaining, and let me tell you, you’ve hit the nail on the head. Your concept is outstanding; the problem is one thing that not enough persons are speaking intelligently about. I’m very glad that I stumbled across this in my seek for something regarding this.

  6. My brother suggested I would possibly like this blog.
    He was totally right. This publish truly made my day. You cann’t imagine simply how much time I had spent for this
    info! Thank you!

Leave a Reply

Your email address will not be published. Required fields are marked *