Ich möchte wissen, ob eine Klasse von einer Klasse und einer Schnittstelle erben kann. Der folgende Beispielcode funktioniert nicht, aber ich denke, er vermittelt, was ich tun möchte. Der Grund, warum ich dies tun möchte, ist, dass wir in meinem Unternehmen USB-, serielle, Ethernet- usw. Geräte herstellen. Ich versuche, eine generische Komponente / Schnittstelle zu entwickeln, mit der ich Programme für alle unsere Geräte schreiben kann, die dazu beitragen, dass die allgemeinen Dinge (wie Verbinden, Trennen, Abrufen der Firmware) für alle unsere Anwendungen gleich bleiben.
So fügen Sie dieser Frage hinzu: Wenn sich GenericDevice in einem anderen Projekt befindet, kann ich die IOurDevices-Schnittstelle in dieses Projekt einfügen und dann die USBDevice-Klasse veranlassen, die Schnittstelle zu implementieren, wenn ich einen Verweis auf das erste Projekt hinzufüge? Denn ich möchte nur auf ein Projekt verweisen und dann je nach Gerät unterschiedliche Schnittstellen implementieren.
class GenericDevice
{
private string _connectionState;
public connectionState
{
get{return _connectionState; }
set{ _connectionState = value;}
}
}
interface IOurDevices
{
void connectToDevice();
void DisconnectDevice();
void GetFirmwareVersion();
}
class USBDevice : IOurDevices : GenericDevice
{
//here I would define the methods in the interface
//like this...
void connectToDevice()
{
connectionState = "connected";
}
}
//so that in my main program I can do this...
class myProgram
{
main()
{
USBDevice myUSB = new USBDevice();
myUSB.ConnectToDevice;
}
}
quelle
Antworten:
Ja. Versuchen:
Hinweis: Die Basisklasse sollte vor der Liste der Schnittstellennamen stehen.
Natürlich müssen Sie immer noch alle Mitglieder implementieren, die die Schnittstellen definieren. Wenn die Basisklasse jedoch ein Element enthält, das einem Schnittstellenmitglied entspricht, kann das Basisklassenmitglied als Implementierung des Schnittstellenelements fungieren, und Sie müssen es nicht erneut manuell implementieren.
quelle
USBDevice : IOurDevice
. Das explizite Hinzufügen der Implementierung wirkt sich nicht auf die Basisklasse aus, kann jedoch dazu beitragen, die Schnittstelle hervorzuheben.Nein, nicht genau. Aber es kann von einer Klasse erben und implementieren eine oder mehrere Schnittstellen.
Eine klare Terminologie ist wichtig, wenn solche Konzepte diskutiert werden. Eines der Dinge, die Sie sehen werden, wie Jon Skeet zum Beispiel hier und in gedruckter Form schreibt, ist, dass er immer präzise in der Art ist, wie er Dinge beschreibt.
quelle
Unabhängig von der Frage (Mehrdads Antwort sollte Sie zum Laufen bringen), und ich hoffe, dass dies nicht als pingelig angesehen wird: Klassen erben keine Schnittstellen, sie implementieren sie.
.NET unterstützt keine Mehrfachvererbung, daher kann es bei der Kommunikation hilfreich sein, die Begriffe klar zu halten. Eine Klasse kann von einer Oberklasse erben und so viele Schnittstellen implementieren, wie sie möchte.
Als Antwort auf Erics Kommentar ... hatte ich eine Diskussion mit einem anderen Entwickler darüber, ob Schnittstellen Schnittstellen mit einer Deklaration wie "erben", "implementieren", "erfordern" oder "mitbringen".
Die technische Antwort lautet:
ITwo
ErbtIOne
aus mehreren Gründen:ITwo
ImplementierungenIOne
völlig falsch sindITwo
erbtIOne
Methoden, wennMethodOne()
vorhanden,IOne
dann ist es auch zugänglich vonITwo
. dh:((ITwo)someObject).MethodOne())
ist gültig, obwohlITwo
es keine explizite Definition für enthältMethodOne()
typeof(IOne).IsAssignableFrom(typeof(ITwo))
kehrt zurücktrue
Wir waren uns schließlich einig, dass Schnittstellen echte / vollständige Vererbung unterstützen. Die fehlenden Vererbungsfunktionen (wie Überschreibungen, abstrakte / virtuelle Accessoren usw.) fehlen in Schnittstellen, nicht in der Schnittstellenvererbung. Es macht das Konzept immer noch nicht einfach oder klar, aber es hilft zu verstehen, was in Erics Welt wirklich unter der Haube vor sich geht :-)
quelle
Ich fand die Antwort auf den zweiten Teil meiner Fragen. Ja, eine Klasse kann eine Schnittstelle implementieren, die sich in einer anderen Klasse befindet, solange die Schnittstelle als öffentlich deklariert ist.
quelle
class ContainsAll { private interface INested { /* ... */ } private class MyExample : INested { /* ... */ } }
dieMyExample
Klasse eine verschachtelte private Schnittstelle. In anderen Beispielen könnte die verschachtelte Schnittstelle (und die enthaltende Klasse) seininternal
. Es hängt alles davon ab, wer sie verwenden und sich um sie kümmern muss.