2009-08-08 8 views
3

Ich habe diese Klasse/Schnittstellendefinitionen in C#C# geschützte Methode geerbt Schnittstelle implementieren

public class FooBase { 
    ... 
    protected bool Bar() { ... } 
    ... 
} 

public interface IBar { 
    bool Bar(); 
} 

Jetzt möchte ich eine Klasse Foo1 von FooBase abgeleitet erstellen IBar Umsetzung:

public class Foo1 : FooBase, IBar { 
} 

Gibt es eine Klasse Deklaration Magie, dass der Compiler die geerbte geschützte Methode als die öffentlich zugängliche Implementierung der Schnittstelle verwendet?

Natürlich ein Foo1 Methode

bool IBar.Bar() 
{ 
    return base.Bar(); 
} 

funktioniert. Ich bin nur neugierig, ob es eine Abkürzung gibt;)

Das Ausschließen dieser Methode führt zu einem Compiler-Fehler: Foo1 implementiert keine Schnittstelle Mitglied IBar.Bar(). FooBase.Bar() ist entweder statisch, nicht öffentlich oder hat den falschen Rückgabetyp.

Erläuterung: Ich teile Codevererbung (Klassenhierarchie) und Featureimplementierung (Schnittstellen). Daher ist der Zugriff auf gemeinsamen (vererbten) Code für Klassen, die dieselbe Schnittstelle implementieren, sehr praktisch.

Antwort

4

Keine Abkürzung. In der Tat ist dieses Muster in wenigen Orten verwendet Ich habe gesehen (nicht unbedingt mit ICollection, aber Sie erhalten die Idee):

public class Foo : ICollection 
{ 
    protected abstract int Count 
    { 
     get; 
    } 

    int ICollection.Count 
    { 
     get 
     { 
      return Count; 
     } 
    } 
} 
1

Ich glaube, dass Ihr Code so kurz ist, wie es sein kann. Ich glaube nicht, dass es irgendeine Abkürzung gibt.

1

Das geschützte Mitglied FooBase.Bar() keine Implementierungsmethode ist der Schnittstelle IBar. Die Schnittstelle erfordert eine öffentliche Methode Bar().

Es gibt 2 Möglichkeiten, eine Schnittstelle zu implementieren. Explizite Implementierung oder implizite Implementierung.

Folgendes ist explizite Implementierung. Diese Methode wird aufgerufen, wenn ein Objekt von Foo über eine IBar-Variable aufgerufen wird.

bool IBar.Bar() 
{ 
    return base.Bar(); 
} 

eine öffentliche Methode Bar definieren() ist implizite Umsetzung.

Um den Compiler zufriedenzustellen, überschreiben Sie die baseclass-Methode als public (keine gute Empfehlung, wenn die Methode in baseclass geschützt ist).

Der Trick besteht darin, eine Schnittstelle zu implementieren, aber nicht alle Schnittstellenmitglieder als öffentliche Mitglieder in der Klasse.

Verwandte Themen