Heim > Backend-Entwicklung > C#.Net-Tutorial > Vergleichen Sie die Unterschiede zwischen Schnittstellen und Klassen in .NET

Vergleichen Sie die Unterschiede zwischen Schnittstellen und Klassen in .NET

巴扎黑
Freigeben: 2017-08-06 10:19:07
Original
1358 Leute haben es durchsucht

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();
}
Nach dem Login kopieren

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

was 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 diese beiden Methoden sinnvoll auf das Programm angewendet werden können.

Das obige ist der detaillierte Inhalt vonVergleichen Sie die Unterschiede zwischen Schnittstellen und Klassen in .NET. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage