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?
Antworten
Zu viele Anzeigen?Ich habe an einigen Stellen gesehen, dass die abstrakte Methode wie folgt definiert ist. **
"Eine abstrakte Methode muss in der untergeordneten Klasse implementiert werden"
** Ich hatte das Gefühl, es ist wie .
Es ist nicht notwendig, dass eine abstrakte Methode in einer Kindklasse implementiert werden muss, wenn die untergeordnete Klasse ebenfalls abstrakt ist ..
1) Eine abstrakte Methode kann nicht eine private Methode sein. 2) Eine abstrakte Methode kann nicht in derselben abstrakten Klasse implementiert werden.
Ich würde sagen, wenn wir eine abstrakte Klasse implementieren, müssen Sie die abstrakten Methoden der abstrakten Basisklasse außer Kraft setzen. Weil Die Implementierung der abstrakten Methode ist mit Überschreiben Sie Ähnlich wie bei der virtuellen Methode.
Es ist nicht notwendig, dass eine virtuelle Methode in einer geerbten Klasse implementiert wird.
----------CODE--------------
public abstract class BaseClass
{
public int MyProperty { get; set; }
protected abstract void MyAbstractMethod();
public virtual void MyVirtualMethod()
{
var x = 3 + 4;
}
}
public abstract class myClassA : BaseClass
{
public int MyProperty { get; set; }
//not necessary to implement an abstract method if the child class is also abstract.
protected override void MyAbstractMethod()
{
throw new NotImplementedException();
}
}
public class myClassB : BaseClass
{
public int MyProperty { get; set; }
//You must have to implement the abstract method since this class is not an abstract class.
protected override void MyAbstractMethod()
{
throw new NotImplementedException();
}
}
Aus allgemeiner objektorientierter Sicht:
Bezüglich der abstrakten Methode : Wenn Sie eine abstrakte Methode in die übergeordnete Klasse einfügen, sagen Sie damit den untergeordneten Klassen: Hey, beachte, dass du eine Methodensignatur wie diese hast. Und wenn ihr sie benutzen wollt, solltet ihr eure eigene implementieren!
Bezüglich der virtuellen Funktion : Wenn Sie eine virtuelle Methode in die übergeordnete Klasse einfügen, sagen Sie damit den abgeleiteten Klassen: Hey, hier gibt es eine Funktion, die etwas für dich tut. Wenn dies für dich nützlich ist, dann benutze es. Wenn nicht, überschreibe sie und implementiere deinen Code, du kannst sogar meine Implementierung in deinem Code verwenden!
Dies ist eine Philosophie über die Unterschiede zwischen diesen beiden Konzepten in General OO
Die Antwort darauf wurde bereits mehrfach gegeben, aber die Frage, wann die einzelnen Methoden verwendet werden sollen, ist eine Entscheidung zur Entwurfszeit. Ich würde es als gute Praxis ansehen, zu versuchen, gemeinsame Methodendefinitionen in verschiedene Schnittstellen zu bündeln und sie in Klassen auf geeigneten Abstraktionsebenen zu integrieren. Wenn man einen gemeinsamen Satz von abstrakten und virtuellen Methodendefinitionen in eine Klasse packt, wird die Klasse unantastbar, obwohl es vielleicht besser wäre, eine nicht-abstrakte Klasse zu definieren, die einen Satz von prägnanten Schnittstellen implementiert. Wie immer hängt es davon ab, was für die spezifischen Anforderungen Ihrer Anwendung am besten geeignet ist.
Eine abstrakte Funktion ist "nur" eine Signatur, ohne eine Implementierung. Sie wird in einer Schnittstelle verwendet, um zu deklarieren, wie die Klasse verwendet werden kann. Sie muss in einer der abgeleiteten Klassen implementiert werden.
Eine virtuelle Funktion (eigentlich eine Methode) ist eine Funktion, die Sie ebenfalls deklarieren und in einer der Klassen der Vererbungshierarchie implementieren sollten.
Die geerbten Instanzen einer solchen Klasse erben auch die Implementierung, es sei denn, Sie implementieren sie in einer hierarchisch niedrigeren Klasse.