Schnittstellen und Klassen werden in unserer täglichen Entwicklung häufig verwendet. Was ist der Unterschied zwischen den beiden? Was sind die Vor- und Nachteile? Der folgende Artikel stellt Ihnen relevante Informationen zum Unterschied zwischen Schnittstellen und Klassen in .NET vor. Freunde, die sie benötigen, können einen Blick darauf werfen.
Vorwort
Jeder sollte wissen, dass in .Net Schnittstellen bereitgestellt werden, die sich von der Typdefinition von Klasse oder Struktur unterscheiden. In einigen Fällen scheinen Schnittstellen mit abstrakten Klassen identisch zu sein, sodass einige Leute glauben, dass abstrakte Klassen in .Net vollständig durch Schnittstellen ersetzt werden können. Tatsächlich ist dies nicht der Fall. Schnittstellen und abstrakte Klassen haben jeweils ihre eigenen Stärken und Schwächen, daher werden sie in Anwendungen häufig kombiniert verwendet, um sich gegenseitig zu ergänzen. Im Folgenden gibt es nicht viel zu sagen. Werfen wir einen Blick auf die ausführliche Einführung.
Als Nächstes sprechen wir über den Unterschied zwischen abstrakten Klassen und Schnittstellen:
Unterschied 1. Die von den beiden ausgedrückten Konzepte sind unterschiedlich. Eine abstrakte Klasse ist ein hoher Grad an Aggregation einer Klasse von Dingen. Für Unterklassen, die abstrakte Klassen erben, handelt es sich um eine „Ja“-Beziehung. Es heißt: „Das Verhalten muss entsprechend der Schnittstelle vervollständigt werden.“ Das klingt vielleicht etwas falsch, aber hier ist ein Beispiel. Zum Beispiel ist „Hund“ ein allgemeiner Begriff für alle Hunde, „Pekinese“ ist „Hund“ und „Schäferhund“ ist „Hund“. Im Vergleich zu „Pekinese“ und „Schäferhund“ gehört „Hund“ zum Abstrakten Art dieser Art von Dingen; und für die Wirkung des „Bellens“ können Hunde bellen und auch Vögel können bellen. Offensichtlich entspricht Ersteres der abstrakten Klasse, während sich Letzteres auf die Schnittstelle bezieht.
Unterschied 2: Beim Definieren einer Typmethode für eine abstrakte Klasse kann der Implementierungsteil der Methode angegeben werden oder nicht, während bei einer Schnittstelle der Implementierungsteil für keine darin definierte Methode angegeben werden kann.
Zum Beispiel:
publicabstractclassAbsTest { publicvirtualvoidTest() { Debug.WriteLine("Test"); } publicabstractvoidNewTest(); } publicinterfaceITest { voidTest(); voidNewTest(); }
Unterschied drei: Vererbungsklassen haben unterschiedliche Implementierungen der in den beiden beteiligten Methoden. Die geerbte Klasse muss die von der abstrakten Klasse definierten abstrakten Methoden nicht neu schreiben, das heißt, die Methoden der abstrakten Klasse können für die von der Schnittstellenklasse definierten Methoden oder Attribute erweitert werden, die entsprechenden Methoden müssen angegeben werden die geerbte Klasse. Die Methoden und Eigenschaften werden implementiert.
Der vierte Unterschied besteht darin, dass in einer abstrakten Klasse, wenn eine neue Methode hinzugefügt wird, die geerbte Klasse nicht für die Verarbeitung von Schnittstellen verwendet werden muss, sondern die geerbte Klasse geändert werden muss, um eine neue Methode bereitzustellen definierte Methode.
Da wir nun den Unterschied zwischen den beiden kennen, sprechen wir über die Vorteile von Schnittstellen gegenüber abstrakten Klassen.
Vorteil 1: Schnittstellen können nicht nur auf Referenztypen, sondern auch auf Werttypen agieren. Abstrakte Klassen können nur auf Referenztypen reagieren.
Vorteil 2: Die .Net-Typvererbung kann nur eine Einzelvererbung sein, was bedeutet, dass ein Typ nur einen Typ, aber mehrere Schnittstellen erben kann. Tatsächlich stimme ich diesem Punkt zu. Mehrfachvererbung wird den Vererbungsbaum verwirrend machen.
Vorteil 3: Da Schnittstellen nur Eigenschaften und Methoden definieren und wenig mit den tatsächlich implementierten Typen zu tun haben, können Schnittstellen von mehreren Typen wiederverwendet werden. Im Gegensatz dazu ist die Beziehung zwischen abstrakten Klassen und geerbten Klassen enger.
Vorteil 4: Durch Schnittstellen können Sie die von einem Typ bereitgestellten Attribute und Methoden reduzieren und so den Schutz von Typobjekten erleichtern. Wenn ein Typ, der eine Schnittstelle implementiert, möglicherweise andere Methoden oder Attribute enthält, die Methode jedoch zurückgegeben werden kann, kann sie das Schnittstellenobjekt zurückgeben. Auf diese Weise kann das aufrufende Ende nur über die von bereitgestellten Methoden oder Attribute auf die relevanten Elemente des Objekts zugreifen die Schnittstelle, die das Objekt effektiv schützen kann.
Vorteil 5: Reduzieren Sie die Unboxing-Vorgänge von Werttypen. Für durch Struct definierte Werttypdaten müssen sie, wenn sie in einer Sammlung gespeichert werden, jedes Mal entpackt werden, wenn sie herausgenommen werden. In diesem Fall wird die Methode der Kombination von Struct+Interface verwendet, um den Entpackvorgang zu reduzieren.
Im Vergleich zu abstrakten Klassen haben Schnittstellen so viele Vorteile, aber Schnittstellen haben eine schwerwiegende Schwäche: Die von der Schnittstelle definierten Methoden und Eigenschaften können nur relativ zu dem Typ sein, der sie erbt (sofern sie nicht in geändert werden). Wenn es sich um mehrschichtige Vererbungsbeziehungen handelt, ist es schwierig, diese nur über Schnittstellen zu implementieren. Denn wenn jeder Typ die Schnittstelle erbt und implementiert, ist das Schreiben von Code umständlicher und manchmal ist das Ausführungsergebnis falsch, insbesondere wenn das Untertypobjekt für den Zugriff implizit in ein Basisklassenobjekt konvertiert wird.
Zu diesem Zeitpunkt muss es mithilfe von Schnittstellen in Kombination mit virtuellen Methoden implementiert werden. Sollten wir bei der Vererbung tatsächlich Schnittstellen oder abstrakte Klassen verwenden? Die Schnittstelle ist fest und konventionell, daher muss die Implementierung der entsprechenden Methoden und Eigenschaften der Schnittstelle in der geerbten Klasse bereitgestellt werden. Bei abstrakten Klassen durchläuft die Implementierung der Definitionsmethode der abstrakten Klasse den gesamten Vererbungsbaum, sodass die Implementierung oder das Umschreiben der Methoden ungewiss ist. Daher sind abstrakte Klassen relativ gesehen flexibler als Schnittstellen.
Eine einfache Vergleichstabelle zwischen den beiden finden Sie unten.
Schnittstelle |
Abstrakte Klasse |
|
Mehrfachvererbung |
Unterstützt |
Nicht unterstützt |
Typbeschränkungen |
Nein |
Ja, es kann nur ein Referenztyp sein |
Methode Implementierung |
Die Methodenimplementierung muss im geerbten Typ angegeben werden |
Sie muss nicht in der geerbten Klasse angegeben werden |
Erweiterbarkeit |
Es ist mühsam |
Relativ flexibel |
Mehrstufige Vererbung |
ist problematischer und erfordert die Verwendung virtueller Funktionen |
welche ist flexibler |
Im Allgemeinen sind Schnittstellen und abstrakte Klassen Sprachmittel, die von .Net bereitgestellt werden, um die Vererbungsbeziehung zwischen Typen besser zu realisieren, und die beiden ergänzen sich in gewisser Weise zueinander. Daher betone ich nicht, was zu verwenden ist und was nicht. Der Schlüssel zum Problem liegt darin, wie man diese beiden Methoden sinnvoll auf das Programm anwendet.
Das obige ist der detaillierte Inhalt vonVergleichen Sie Schnittstellen und Klassen in .NET. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!