1723 Stimmen

Was ist der Unterschied zwischen einer abstrakten Methode und einer virtuellen Methode?

Was ist der Unterschied zwischen einer abstrakten Methode und einer virtuellen Methode? In welchen Fällen ist es empfehlenswert, abstrakte oder virtuelle Methoden zu verwenden? Welcher Ansatz ist der beste?

6voto

Rodrick Chapman Punkte 5327

Verbindlich ist der Prozess der Zuordnung eines Namens zu einer Codeeinheit.

Späte Bindung bedeutet, dass wir den Namen verwenden, aber die Zuordnung aufschieben. Mit anderen Worten: Wir erstellen/erwähnen den Namen zuerst und überlassen die Zuordnung des Codes zu diesem Namen einem nachfolgenden Prozess.

Nun überlegen Sie:

  • Im Vergleich zu Menschen sind Maschinen wirklich gut im Suchen und Sortieren
  • Im Vergleich zu Maschinen sind Menschen wirklich gut in Erfindung und Innovation

Die kurze Antwort lautet also: virtual ist eine späte Bindungsanweisung für die Maschine (Laufzeit), während abstract ist die späte Bindungsanweisung für den Menschen (Programmierer)

Mit anderen Worten, virtual bedeutet:

"Lieber Laufzeit binden Sie den entsprechenden Code an diesen Namen, indem Sie das tun, was Sie am besten können: Suche "

. abstract bedeutet:

"Lieber Programmierer verbinden Sie bitte den entsprechenden Code mit diesem Namen, indem Sie das tun, was Sie am besten können: Erfindung "

Der Vollständigkeit halber, Überlastung bedeutet:

"Lieber Compiler binden Sie den entsprechenden Code an diesen Namen, indem Sie das tun, was Sie am besten können: Sortierung ".

4voto

Brann Punkte 30431

Grundsätzlich verwenden Sie eine virtuelle Methode, wenn Sie möchten, dass die Erben die Funktionalität erweitern, WENN sie dies möchten.

Sie verwenden abstrakte Methoden, wenn Sie möchten, dass die Erben die Funktionalität implementieren (und in diesem Fall haben sie keine Wahl)

4voto

flik Punkte 3099

Virtuelle Methode :

  • Virtuell bedeutet, dass wir sie außer Kraft setzen können.

  • Virtual Function hat eine Implementierung. Wenn wir die Klasse erben, können wir können wir die virtuelle Funktion außer Kraft setzen und unsere eigene Logik bereitstellen.

  • Wir können den Rückgabetyp der virtuellen Funktion ändern, indem wir die
    Funktion in der untergeordneten Klasse (die man als Konzept der
    Beschattung).

Abstrakte Methode

  • Abstrakt bedeutet, dass wir sie außer Kraft setzen MÜSSEN.

  • Eine abstrakte Funktion hat keine Implementierung und muss in einer abstrakten Klasse enthalten sein.

  • Sie kann nur deklariert werden. Dadurch ist die abgeleitete Klasse gezwungen, die Implementierung dieser Funktion bereitzustellen.

  • Ein abstraktes Mitglied ist implizit virtuell. Das abstrakte Element kann in einigen Sprachen als rein virtuell bezeichnet werden.

    public abstract class BaseClass
    { 
        protected abstract void xAbstractMethod();
    
        public virtual void xVirtualMethod()
        {
            var x = 3 + 4;
        }
    }

2voto

BenKoshy Punkte 29349

Die meisten der oben genannten Beispiele verwenden Code - und sie sind sehr, sehr gut. Ich brauche nicht zu ergänzen, was sie sagen, aber das Folgende ist eine einfache Erklärung, die eher auf Analogien als auf Code/Fachbegriffe zurückgreift.

Simple Explanation - Erklärung anhand von Analogien

Abstrakte Methode

Denken Sie an George W. Bush. Er sagt zu seinen Soldaten: "Geht in den Irak kämpfen". Und das war's. Alles, was er gesagt hat, ist, dass gekämpft werden muss. Er hat nicht festgelegt wie genau das wird passieren. Aber ich meine, man kann nicht einfach rausgehen und "kämpfen": Was bedeutet das genau? Kämpfe ich mit einer B-52 oder mit meiner Derringer? Diese spezifischen Details überlasse ich jemand anderem. Dies ist eine abstrakte Methode.

Virtuelle Methode

David Petraeus ist ein hochrangiges Mitglied der Armee. Er hat definiert, was Kampf bedeutet:

  1. Den Feind finden
  2. Neutralisieren Sie ihn.
  3. Danach ein Bier trinken

Das Problem ist, dass es sich um eine sehr allgemeine Methode handelt. Es ist eine gute Methode, die funktioniert, aber manchmal nicht spezifisch genug ist. Das Gute für Petraeus ist, dass seine Befehle Spielraum und Umfang haben - er hat anderen erlaubt, seine Definition von "Kampf" entsprechend ihren besonderen Anforderungen zu ändern.

Der Gefreite Job Bloggs liest Petraeus' Befehl und erhält die Erlaubnis, seine eigene Version des Kampfes nach seinen speziellen Anforderungen durchzuführen:

  1. Feind finden.
  2. Schießen Sie ihm in den Kopf.
  3. Nach Hause gehen
  4. Trinken Sie Bier.

Auch Nouri al Maliki erhält die gleichen Befehle von Petraeus. Er soll ebenfalls kämpfen. Aber er ist ein Politiker und kein Infanterist. Natürlich kann er nicht herumgehen und seinen politischen Feinden in den Kopf schießen. Da Petraeus ihm eine virtuelle Methode vorgegeben hat, kann Maliki seine eigene Version der Kampfmethode anwenden, je nach seinen besonderen Umständen:

  1. Feind finden.
  2. Lassen Sie ihn mit irgendwelchen erfundenen Anschuldigungen verhaften.
  3. Nach Hause gehen
  4. Trinken Sie Bier.

Mit anderen Worten, eine virtuelle Methode liefert Standardanweisungen - aber es handelt sich um allgemeine Anweisungen, die von Personen in der unteren Hierarchie der Armee je nach ihren besonderen Umständen präzisiert werden können.

Der Unterschied zwischen den beiden

  • George Bush weist keine Einzelheiten der Umsetzung nach. Diese müssen von jemand anderem geliefert werden. Dies ist eine abstrakte Methode.

  • Petraeus auf der anderen Seite tut Er hat jedoch seinen Untergebenen die Erlaubnis erteilt, seine Anordnungen durch ihre eigene Version zu ersetzen, falls ihnen etwas Besseres einfallen sollte.

Ich hoffe, das hilft.

2voto

Kedarnath M S Punkte 79

Abstrakte Funktion(Methode) :

Eine abstrakte Methode ist eine Methode, die mit dem Schlüsselwort abstract deklariert wird.

Sie hat keinen Körper.

Sie sollte von der abgeleiteten Klasse implementiert werden.

Wenn eine Methode abstrakt ist, sollte die Klasse abstrakt sein.

virtuelle Funktion(Methode) :

Eine virtuelle Methode ist eine Methode, die mit dem Schlüsselwort virtual deklariert wird und die von einer abgeleiteten Klassenmethode mit dem Schlüsselwort override überschrieben werden kann.

Es liegt an der abgeleiteten Klasse, ob sie es überschreiben will oder nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X