Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 18805|Antwort: 0

[Kommunikation] Die Ähnlichkeiten und Unterschiede zwischen virtueller und (abstrakter) Abstraktion und Schnittstelle in C#...

[Link kopieren]
Veröffentlicht am 22.04.2019 14:41:09 | | |
Interpretation 1

In C# sind abstrakt und virtuell verwirrend, beide bezüglich der Vererbung und beinhalten die Verwendung von Override. Lassen Sie uns die Unterschiede zwischen den beiden besprechen:

1. Virtuelle Methode

Virtual Keyword wird verwendet, um Methoden in der Basisklasse zu modifizieren. Es gibt zwei Situationen, in denen virtuell verwendet wird:

Szenario 1: Eine virtuelle Methode ist in der Basisklasse definiert, aber die virtuelle Methode wird in der abgeleiteten Klasse nicht umgeschrieben. Im Aufruf der abgeleiteten Klasseninstanz verwendet die virtuelle Methode die von der Basisklasse definierte Methode.

Szenario 2: Eine virtuelle Methode wird in der Basisklasse definiert und anschließend wird die Methode mithilfe eines Override in der abgeleiteten Klasse neu geschrieben. Im Aufruf der abgeleiteten Klasseninstanz verwendet die virtuelle Methode die abgeleitete Rewrite-Methode.

2. Abstrakte Methode (abstrakte Methode)

Das abstrakte Schlüsselwort kann nur in abstrakten Klassen verwendet werden, um Methoden zu modifizieren, und es gibt keine spezifische Implementierung. Die Implementierung abstrakter Methoden muss mit dem Override-Schlüsselwort in der abgeleiteten Klasse realisiert werden.

Der wesentlichste Unterschied zwischen einer Schnittstelle und einer abstrakten Klasse: Eine abstrakte Klasse ist eine unvollständige Klasse, eine Abstraktion eines Objekts, während eine Schnittstelle eine Verhaltensnorm ist.


3. Schlüsselwörter

Statisch: Wenn eine Methode als statisch deklariert wird, ist sie eine statische Methode und der Compiler behält die Implementierung der Methode zur Kompilierungszeit. Das heißt, die Methode gehört zu einer Klasse, aber zu keinem Element, unabhängig davon, ob eine Instanz der Klasse existiert oder nicht. Ähnlich wie die Eintrittsfunktion Static Void Main kann sie aufgrund ihrer statischen Funktion direkt genannt werden.

Virtua: Wenn eine Methode als Virtuell deklariert wird, ist sie eine virtuelle Methode, bis Sie die Variable ClassName = new ClassName() verwenden; Bevor eine Instanz einer Klasse deklariert wird, existiert sie nicht im realen Speicherraum. Dieses Schlüsselwort wird bei der Klassenvererbung sehr häufig verwendet, um Polymorphismusunterstützung für Klassenmethoden bereitzustellen.

Overrride: zeigt eine Umschreibung an. Diese Klasse erbt von der Shape-Klasse.
virtuell, abstrakt bedeutet, anderen Klassen, die von ihm erben wollen, mitzuteilen, dass du diese Methode oder Eigenschaft von mir überschreiben kannst, sonst ist sie nicht erlaubt.
Abstrakt: Die abstrakte Methodendeklaration ist eine Methode, die von einer abgeleiteten Klasse überschrieben werden muss, die zum Vererben verwendet wird; Sie kann als imaginäre Methode ohne Realisierung betrachtet werden; Wenn eine Klasse eine abstrakte Methode enthält, muss die Klasse als abstrakte Klasse definiert sein, unabhängig davon, ob sie andere allgemeine Methoden enthält oder nicht; Abstrakte Klassen können keine Substanzen besitzen.

a) Die Methode der virtuellen Modifikation muss eine Methodenimplementierung haben (auch wenn es nur ein Paar von Klammern ist), und die Methode der abstrakten Modifikation darf keine Implementierung haben.

b) virtuell kann von Unterklassen umgeschrieben werden, abstrakt muss von Unterklassen umgeschrieben werden

c) Wenn eine Funktion in einer Klasse durch Abstakt modifiziert wird, muss auch der Klassenname mit Abstakt modifiziert werden

d) Abstrakt modifizierte Klassen können keine Instanzen erstellt werden.

e) Wenn eine Methode in C# darauf vorbereitet ist, die Elternklasse in der Unterklasse umzuschreiben, muss die Methode mit virtual in der Elternklasse und Overide in der Unterklasse modifiziert werden, um zu verhindern, dass der Programmierer versehentlich die Elternmethode der Elternklasse in der Unterklasse umschreibt.

Hinweis: Mit Abstract modifizierte Klassen können nur vererbt, nicht instanziiert werden.

Interpretation 2

Sowohl virtuell als auch abstrakt werden verwendet, um die Elternklasse zu modifizieren, sodass die Kindklasse durch Überschreiben der Definition der Elternklasse neu definiert werden kann.

Sie haben eines gemeinsam: Wenn sie zur Änderung von Methoden verwendet werden, muss öffentlich vor ihnen hinzugefügt werden, sonst gibt es Kompilierungsfehler: virtuelle oder abstrakte Methoden können nicht privat sein. Schließlich erlaubt das Hinzufügen von virtueller oder abstrakter Elemente die Neudefinition der Unterklasse, und private Mitglieder können von der Unterklasse nicht zugänglich sein.

Aber sie sind sehr unterschiedlich. (virtuell ist "virtuell", abstrakt ist "abstrakt").

(1) Die Methode der virtuellen Modifikation muss implementiert werden (auch wenn sie nur ein Paar Klammern hinzufügt), während die Methode der abstrakten Modifikation nicht implementiert werden darf. Zum Beispiel, wenn die Methode der virtuellen Modifikation nicht implementiert ist:

Fehler: "Test1.fun1()" muss den Körper deklarieren, da er nicht als abstrakt, extern oder partiell markiert ist   

Für abstrakte Modifikatoren, falls implementiert:


Fehler: "Test2.fun2()" kann den Körper nicht deklarieren, da er als abstrakt markiert ist   

(2) virtuell kann von Unterklassen umgeschrieben werden, während abstrakt von Unterklassen umgeschrieben werden muss.
Es gibt keinen Fehler beim Kompilieren; wenn die Methode des virtuellen Modifikators neu geschrieben wird, muss ein Override davor hinzugefügt werden (was dem Compiler mitteilt, dass Sie die virtuelle Methode umschreiben möchten), und es muss eine Implementierung geben, sonst ist die Kompilierung falsch:
(3) Wenn ein Klassenmitglied durch Abstract modifiziert wird, muss Abstract vor der Klasse hinzugefügt werden, da nur abstrakte Klassen abstrakte Methoden haben können.

(4) Instanzen abstrakter Klassen können nicht erstellt werden, sie können nur vererbt und nicht instanziiert werden, zum Beispiel: BaseTest2 base2 = neuer BaseTest2(); Es gibt einen Kompilierungsfehler: Eine abstrakte Klasse oder Schnittstelle kann keine Instanz erstellen.

(5) In C# muss man, wenn man eine Methode in einer Unterklasse umschreiben möchte, virtual vor die Elternmethode hinzufügen und vor der Unterklassemethode überschreiben, um zu vermeiden, dass Programmierer versehentlich die Elternmethode in der Unterklasse umschreiben.

(6) Die abstrakte Methode muss überschrieben werden, und die virtuelle Methode muss eine Implementierung haben (auch wenn sie in der abstrakten Klasse definiert ist).
Interpretation 3
Gemeinsamkeiten:
1. Sie können alle vererbt werden
2. Keiner von ihnen kann instanziiert werden
3. Sie kann Methodendeklarationen enthalten
4. Abgeleitete Klassen müssen unrealisierte Methoden implementieren
Unterscheiden:
1. Abstrakte Basisklassen können Felder, Attribute und Methodenimplementierungen definieren. Schnittstellen können nur Attribute, Indexierer, Ereignisse und Methodendeklarationen definieren und können keine Felder enthalten.
2. Eine abstrakte Klasse ist eine unvollständige Klasse, die weiter verfeinert werden muss, während eine Schnittstelle eine Verhaltensnorm ist. Microsofts benutzerdefinierte Schnittstellen verfügen immer über ein fähiges Feld, das beweist, dass sie Ausdruck des "Ich schaffe das..." sind. ”
3. Schnittstellen können mehrfach implementiert werden, und abstrakte Klassen können nur von einer einzigen Person geerbt werden
4. Abstrakte Klassen sind stärker zwischen einer Reihe eng verwandter Klassen definiert, während die meisten Schnittstellen lose miteinander verbunden sind, aber alle eine bestimmte Funktion implementieren
5. Abstrakte Klassen sind Konzepte, die aus einer Reihe verwandter Objekte abstrahiert werden und daher die innere Gemeinsamkeit der Dinge widerspiegeln; Eine Schnittstelle ist eine funktionale Konvention, die definiert ist, um externe Aufrufe zu erfüllen, und spiegelt daher die äußeren Eigenschaften von Dingen wider
6. Die Schnittstelle besitzt im Grunde keine spezifischen Vererbungsmerkmale, sondern verspricht lediglich eine Methode, die aufgerufen werden kann
7. Die Schnittstelle kann zur Unterstützung von Rückrufen verwendet werden, aber die Vererbung verfügt nicht über diese Funktion
8. Die spezifischen Methoden, die von abstrakten Klassen implementiert werden, sind standardmäßig virtuell, aber die Schnittstellenmethoden in der Klasse, die die Schnittstelle implementieren, sind standardmäßig nicht-virtuell; natürlich kann man sie auch als virtuell deklarieren
9. Wenn die abstrakte Klasse die Schnittstelle implementiert, kann die Methode in der Schnittstelle als abstrakte Methode auf die abstrakte Klasse abgebildet werden, ohne sie implementieren zu müssen, aber die Methode in der Schnittstelle kann in der Unterklasse der abstrakten Klasse implementiert werden
Nutzungsregeln:
1. Abstrakte Klassen werden hauptsächlich für eng verwandte Objekte verwendet, während Schnittstellen am besten allgemeine Funktionalität für irrelevante Klassen bereitstellen
2. Wenn Sie eine große funktionale Einheit entwerfen möchten, verwenden Sie abstrakte Klassen; Wenn du kleine, prägnante Funktionsblöcke entwerfen willst, nutze Schnittstellen.
3. Wenn mehrere Versionen der Komponente erstellt werden sollen, wird eine abstrakte Klasse erstellt. Sobald eine Schnittstelle erstellt wurde, kann sie nicht mehr geändert werden. Wenn eine neue Version der Schnittstelle benötigt wird, muss eine komplett neue erstellt werden.
4. Wenn die erstellte Funktion zwischen einer breiten Bandbreite heterogener Objekte verwendet wird, verwenden Sie die Schnittstelle; Wenn Sie gemeinsame implementierte Funktionalität über alle Implementierungen einer Komponente hinweg bereitstellen möchten, verwenden Sie abstrakte Klassen.
5. Das Objekt analysieren, die innere Gemeinsamkeit verfeinern, um eine abstrakte Klasse zu bilden, die dazu dient, das Wesen des Objekts auszudrücken, also "was". Schnittstellen werden priorisiert, wenn externe Aufrufe oder Funktionen erweitert werden müssen
6. Eine gute Schnittstellendefinition sollte spezifisch und funktional sein, nicht multifunktional, sonst führt sie zu einer Schnittstellenverschmutzung. Wenn eine Klasse nur eine Funktion der Schnittstelle implementiert, aber andere Methoden in der Schnittstelle implementieren muss, spricht man von Schnittstellenverschmutzung
7. Versuchen Sie, Vererbung zu vermeiden, um die Formationsfunktion zu erreichen, sondern verwenden Sie Black-Box-Multiplexing, also Objektkombination. Aufgrund der erhöhten Anzahl der Vererbungsstufen ist die direkteste Folge, dass man, wenn man eine Klasse in diesem Taxon aufruft, alle in den Stapel laden muss! Die Konsequenzen lassen sich vorstellen. (In Kombination mit dem Verständnis des Stapelprinzips). Gleichzeitig können interessierte Freunde bemerken, dass Microsoft beim Erstellen einer Klasse oft die Methode der Objektkombination verwendet. Zum Beispiel hat in asp.net die Page-Klasse Eigenschaften wie Server Request, aber tatsächlich sind sie alle Objekte einer bestimmten Klasse. Die Verwendung dieses Objekts der Page-Klasse, um die Methoden und Eigenschaften anderer Klassen aufzurufen, ist ein sehr grundlegendes Designprinzip
Zum Beispiel:
Fensterformen können mit abstrakten Klassen gestaltet werden, und öffentliche Operationen und Eigenschaften können in eine abstrakte Klasse eingefügt werden, sodass das Formular und das Dialogfeld von dieser abstrakten Klasse erben und dann entsprechend ihren eigenen Bedürfnissen erweitert und verbessert werden können.

Der Druckvorgang kann als Schnittstelle zu jedem Formular bereitgestellt werden, das diese Funktion benötigt, da der Inhalt des Formulars unterschiedlich ist und sie ihre eigene Druckfunktion entsprechend ihren Anforderungen implementieren müssen. Beim Drucken wird er nur über die Schnittstelle aufgerufen, unabhängig davon, welches Formular gedruckt wird.

Gemeinsamkeit, Individualität und Wahlfreiheit:
Einige Bücher schreiben, dass C# empfiehlt, Schnittstellen anstelle abstrakter Basisklassen zu verwenden, und betonen die vielen Vorteile der Nutzung von Schnittstellen, denen ich nicht widerspreche; aus der obigen Liste gibt es immer noch viele Unterschiede zwischen den beiden, und das Vorhandensein dieses Unterschieds muss den Unterschied in anwendbaren Szenarien bestimmen, zum Beispiel kann die abstrakte Basisklasse Standardimplementierungen für einige Methoden bereitstellen, um wiederholte Implementierungen in Unterklassen zu vermeiden und die Wiederverwendbarkeit des Codes zu verbessern. Das ist der Vorteil abstrakter Klassen; Die Schnittstelle kann nur abstrakte Methoden enthalten. Wann abstrakte Basisklassen verwendet werden und wann Schnittstellen verwendet werden, hängt davon ab, wie die Nutzer die Verbindungen zwischen vererbten Klassen betrachten, ob es sich um Persönlichkeitsunterschiede oder gemeinsame Verbindungen zwischen ihnen handelt. Lassen Sie mich das mit einem Lebensbeispiel veranschaulichen.

Wenn dir drei Objekte gegeben werden, nämlich Menschen, Fische und Frösche, und du wirst gebeten, eine Grundkategorie für sie zu entwerfen, um die Verbindung zwischen ihnen zusammenzufassen, dann wirst du als Erstes merken, dass es große Unterschiede zwischen ihnen gibt und es schwierig ist, die Gemeinsamkeiten zu abstrahieren. Hier solltest du Schnittstellen anstelle abstrakter Basisklassen verwenden, aus drei Gründen:
1. Individualität ist wichtiger als Gemeinsamkeit.
2. Persönlichkeiten mit großen Unterschieden zeigen einige der gleichen Verhaltensweisen.
3. Es gibt große Unterschiede in den Realisierungsmethoden desselben Verhaltens.
Zu diesem Zeitpunkt bekommst du drei weitere Objekte, nämlich Karpfen, Karpfen und Goldfische, und kannst weiterhin Basisklassen entwerfen, um die Verbindung zwischen ihnen zusammenzufassen. Das Erste, was du erkennst, ist, dass sie alle zu Fischen gehören, und zweitens, dass ihre Schwimmweise leicht unterschiedlich sein kann, weshalb du abstrakte Basisklassen statt Schnittstellen verwenden solltest. Im Vergleich zum obigen Beispiel gibt es drei Gründe:
1. Gemeinsamkeit ist größer als Individualität
2. Personen mit derselben Gemeinsamkeit müssen die gleichen Eigenschaften und Verhaltensweisen aufweisen
3. Es gibt bestimmte Unterschiede in den Implementierungsmethoden desselben Verhaltens
Unter den mehreren Gründen für die Verwendung von Schnittstellen oder abstrakten Basisklassen ist der dritte Grund tatsächlich derselbe, der das Konzept des Polymorphismus im objektorientierten Bereich beschreibt, das heißt, er wird implementiert, indem die Elternklasse überschrieben und die entsprechende Methode zur Laufzeit entsprechend der passierten Objektreferenz aufgerufen wird. Der zweite Grund beginnt sich zu divergern, wobei Schnittstellen das gleiche Verhalten zwischen vererbten Objekten betonen, während abstrakte Klassen ebenfalls dieselben Eigenschaften zwischen vererbten Objekten betonen. Was Schnittstellen wirklich von abstrakten Basisklassen unterscheidet, sind folgende Gründe:

Schnittstellen werden verwendet, wenn funktionale Gemeinsamkeit zwischen Objekten mit großen Unterschieden angestrebt wird.
Abstrakte Basisklassen werden verwendet, wenn funktionale Unterschiede zwischen Objekten mit größerer Gemeinsamkeit gesucht werden.
Indem wir das Gleiche und das Unterschiedliche vergleichen, können wir nur sagen, dass Schnittstellen und abstrakte Klassen ihre eigenen Stärken haben, aber es gibt keine Vorteile. In der eigentlichen Programmierpraxis müssen wir unsere Talente nach der jeweiligen Situation messen, aber die folgende Erfahrung und Ansammlung kann dir Inspiration geben, zusätzlich zu einigen meiner Ansammlungen stammen viele davon aus den Klassikern, ich glaube, sie können die Prüfung bestehen. Also lernen wir diese Klassiker bei Regeln und Anlässen, das Wichtigste ist, das Gelernte anzuwenden – natürlich werde ich mit den Worten einer Familie das Lachen aller gewinnen, bitte macht weiter.

Regeln und Anlässe:
1. Denken Sie daran, dass eines der wichtigsten Prinzipien des objektorientierten Denkens ist: Schnittstellenorientierte Programmierung.
2. Mit Hilfe von Schnittstellen und abstrakten Klassen wurden viele Ideen aus den 23 Designmustern clever umgesetzt, und ich denke, ihr Wesentliches liegt einfach darin, dass sie auf abstrakte Programmierung ausgerichtet sind.
3. Abstrakte Klassen sollten hauptsächlich für eng verwandte Objekte verwendet werden, während Schnittstellen am besten zur Bereitstellung allgemeiner Funktionalität für irrelevante Klassen geeignet sind.
4. Die Benutzeroberfläche konzentriert sich auf den CAN-DO-Beziehungstyp, während die abstrakte Klasse auf die IS-A-Beziehung fokussiert.
5. Das Verhalten mehrdefinierter Objekte in der Schnittstelle; abstrakte Klassen definieren die Eigenschaften von Objekten mehrfach;
6. Schnittstellendefinitionen können öffentliche, geschützte, interne und private Modifikatoren verwenden, aber fast alle Schnittstellen sind als öffentlich definiert, sodass nicht mehr gesagt werden muss.
7. "Die Schnittstelle bleibt unverändert" ist ein wichtiger Faktor, der berücksichtigt werden sollte. Daher sollten beim Hinzufügen von Erweiterungen aus Schnittstellen neue Schnittstellen hinzugefügt werden, nicht bestehende Schnittstellen.
8. Versuchen Sie, die Schnittstelle als funktionalen Block mit einer einzigen Funktion zu gestalten, nehmen wir das .NET Framework als Beispiel: IDisposable, IDisposable, IComparable, IEquatable, IEnumerable usw. enthalten alle nur eine gemeinsame Methode.
9. Der Großbuchstabe "I" vor dem Schnittstellennamen ist eine Konvention, genauso wie der Feldname mit einem Unterstrich beginnt; bitte halten Sie sich an diese Prinzipien.
10. In der Schnittstelle sind alle Methoden standardmäßig öffentlich.
11. Wenn Versionsprobleme erwartet werden, kann man eine "abstrakte Klasse" erstellen. Wenn du zum Beispiel einen Hund, ein Huhn und eine Ente erschaffst, solltest du in Erwägung ziehen, Tiere zu abstrahieren, um mit Dingen umzugehen, die in Zukunft auftreten könnten. Das Hinzufügen neuer Mitglieder zur Schnittstelle erzwingt alle abgeleiteten Klassen zur Änderung und Neukompilierung, sodass Versionsprobleme am besten mit abstrakten Klassen umgesetzt werden.
12. Nicht-abstrakte Klassen, die von abstrakten Klassen abgeleitet sind, müssen alle vererbten abstrakten Methoden und tatsächliche Implementierungen abstrakter Accessoren enthalten.
13. Das neue Schlüsselwort kann nicht für abstrakte Klassen verwendet werden, noch können sie versiegelt werden, da abstrakte Klassen nicht instanziiert werden können.
14. Statische oder virtuelle Modifikatoren dürfen in abstrakten Methodendeklarationen nicht verwendet werden.





Vorhergehend:C# Enum Simple Permission Design verwendet die FlagsAttribut-Eigenschaft
Nächster:Huang Yongs Yiyun-Klassenzimmer hat ein nullbasiertes Verständnis des WeChat-Mini-Programms
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com