C # ist der Unterschied zwischen abstrakt, virtuell und storniert

c #

Heute möchte ich Ihnen den Unterschied zwischen abstrakter, virtueller und C # -Überschreibung zeigen.

Zusammenfassung

Das Hinzufügen eines Abstracts zu einer Aufgabe oder Klasse bedeutet, dass es unrealistisch ist und erwartet, dass es von der empfangenen Klasse ausgeführt wird. Lassen Sie uns eine abstrakte Klasse von Tieren erstellen:

öffentliche abstrakte Klasse {public empty shell () {Console.WriteLine ("Animal Bark"); }}

Versuchen wir, ein Tierklassenbeispiel zu erstellen.

Tier Tier = neues Tier ();

Lassen Sie uns dies tun und der Compiler gibt Ihnen den Fehler zurück, dass Sie keine abstrakte Klasseninstanz erstellen können

Abschlussklasse kann nicht erstellt werden

Erstellen wir eine Klasse, die von einem Tier geerbt wird.

öffentliche Klasse Hund: Tier {öffentliche Rinde () {Console.WriteLine ("Hunderinde"); }}

Wir können jetzt eine Tierinstanz mit dem Dog-Objekt erstellen. Natürlich erstellen wir auch ein Hundebeispiel vom Typ Hund.

Tier Tier = neuer Hund (); Hund Hund = neuer Hund ();

Normalerweise möchten Sie die erste Zeile verwenden, da beim Erstellen von immer mehr Klassen, die das Tier erben, diese immer noch ein Tiertyp sind und konvertiert werden können, um mit den Parametern des Tiertyps oder der Sammlung zu arbeiten. Dies nennt man Polymorphismus.

Was passiert mit der Funktionsshell? Da es sich bei einem transformierenden Tier um ein Tier handelt, wird die in der Tierklasse definierte Schalenfunktion aufgerufen. Für einen sich ändernden Hund wird aufgrund seines Hundetyps die in der Hundeklasse definierte Rindenfunktion aufgerufen.

Wenn Sie eine Zusammenfassung über Funktionen schreiben, können Sie eine Funktion in dieser Klasse nicht ausführen und müssen sie in der abgeleiteten Klasse ausführen. Ändern wir die Klasse der Tiere und Hunde in:

öffentliche abstrakte Klasse {public abstract bark () {Console.WriteLine ("Animal Bark"); }}
öffentliche Klasse Hund: Tier {öffentliche Rinde () {Console.WriteLine ("Hunderinde"); }}

Kompilierungsfehler wurden während der Ausführung zurückgegeben.

Eine abstrakte Funktion kann nicht ausgeführt werden

Folgen Sie also den Anweisungen des Compilers. Entfernen und hacken Sie die Zwiebelschale in der Tierklasse. Was? Kompilierungsfehler zurückgegeben! ??

Abbrechen

Ja. Hier kommt das zweite Schlüsselwort - Abbrechen. Um die Rindenverwaltungsfunktion in der Tierklasse in der Hundeklasse zu implementieren, müssen Sie die Rindenfunktion abbrechen, um dem Compiler mitzuteilen, dass die Rinde die Rinde in der Tierklasse ausführt (wie zuvor). . Nach der Änderung war die Kompilierung erfolgreich und jetzt können Sie beide Zeilen sehen - "Dog Coat".

Virtuell

Reden wir über virtuell. Durch Hinzufügen einer virtuellen Funktion stellen Sie eine gemeinsame Logik für die Funktion bereit, bieten jedoch die Flexibilität, die Hauptfunktion zu überschreiben. Sie können sagen, dass es sehr ähnlich ist, wenn der Funktion keine virtuelle Funktion hinzugefügt wird. Überhaupt nicht. Jetzt zeige ich Ihnen den Unterschied zwischen einer virtuellen und einer nicht virtuellen Funktion. Lassen Sie uns die Klassen und Grundfunktionen von Tieren und Hunden ändern:

öffentliches Klassenprogramm {static void Main (string [] args) {Tier Tier = neuer Hund (); Hund Hund = neuer Hund (); animal.bark (); it.bark ();
animal.eat (); it.eat ();
Console.ReadLine (); }}
Tier der öffentlichen Klasse {public virtual empty shell () {Console.WriteLine ("Animal Bark"); }}
öffentliches Essen () {Console.WriteLine ("Animal Eating"); }}
öffentliche Klasse Hund: Tier {public void bark () {Console.WriteLine ("Hunderinde"); }}
öffentliches Abendessen () {Console.WriteLine ("Hund essen"); }}

Und das Ergebnis ist:

Wenn Sie eine virtuelle Funktion in der Basisklasse abbrechen, sind die Funktionen in den Klassen Base und Derved identisch. Mit virtuell und ohne Stornierung erhalten Sie zwei verschiedene Funktionen - Animal.bark und Dog.bark.

Lassen Sie uns noch einmal experimentieren. Fügen Sie der Hauptfunktion die folgenden 2 Zeilen hinzu:

Tier animal2 = neues Tier (); animal2.bark ();

Wenn Sie es jetzt ausführen, erhalten Sie die in der Animal-Klasse definierte Logik. Daher fassen wir diese drei Erklärungen und Ergebnisse zusammen:

Tier Tier = neuer Hund (); animal.bark (); // Ausgabe: Hunderinde Hundehund = neuer Hund (); dog.bark (); // Beenden: Hunderinde Animal animal2 = neues Tier (); animal2.bark (); // Ausgabe: Tierrinde

Zusammenfassung:

Wenn Sie eine Klasse zum Abstrahieren eines Themas verwenden, können Sie keine Instanz dieser Klasse erstellen. Sie können eine Klasse von Kindern erben oder eine Klasse von Kindern mit einem grundlegenden Klassentyp erstellen. Wenn Sie eine Funktion verwenden, können Sie die Funktion in der Hauptklasse nicht verwenden und müssen von der untergeordneten Klasse überschrieben werden.

Für die virtuelle können Sie eine Funktion in der Basisklasse ausführen. Sobald die untergeordnete Klasse sie abgebrochen hat, gibt es nur eine Version dieser Funktion.

Der Widerruf kann nur auf virtuelle oder abstrakte Stornierungen angewendet werden.

Das gilt heute auch. Ich hoffe ihr liebt den Artikel und habt einen guten Tag

Ursprünglich veröffentlicht auf timmydinheing.com am 18. April 2018.