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?Hier schreibe ich etwas Beispielcode in der Hoffnung, dass dies ein recht greifbares Beispiel ist, um das Verhalten von Schnittstellen, abstrakten Klassen und normalen Klassen auf einer sehr grundlegenden Ebene zu sehen. Sie können diesen Code auch in Github als Projekt finden, wenn Sie ihn als Demo verwenden möchten: https://github.com/usavas/JavaAbstractAndInterfaceDemo
public interface ExampleInterface {
// public void MethodBodyInInterfaceNotPossible(){
// }
void MethodInInterface();
}
public abstract class AbstractClass {
public abstract void AbstractMethod();
// public abstract void AbstractMethodWithBodyNotPossible(){
//
// };
//Standard Method CAN be declared in AbstractClass
public void StandardMethod(){
System.out.println("Standard Method in AbstractClass (super) runs");
}
}
public class ConcreteClass
extends AbstractClass
implements ExampleInterface{
//Abstract Method HAS TO be IMPLEMENTED in child class. Implemented by ConcreteClass
@Override
public void AbstractMethod() {
System.out.println("AbstractMethod overridden runs");
}
//Standard Method CAN be OVERRIDDEN.
@Override
public void StandardMethod() {
super.StandardMethod();
System.out.println("StandardMethod overridden in ConcreteClass runs");
}
public void ConcreteMethod(){
System.out.println("Concrete method runs");
}
//A method in interface HAS TO be IMPLEMENTED in implementer class.
@Override
public void MethodInInterface() {
System.out.println("MethodInInterface Implemented by ConcreteClass runs");
// Cannot declare abstract method in a concrete class
// public abstract void AbstractMethodDeclarationInConcreteClassNotPossible(){
//
// }
}
}
Abbildung. - Traditionelle Dreiteilung der Sätze.
Unter deontische Logik (die Lehre von der Verpflichtung und der Erlaubnis), ist jeder Satz obligatorisch (Operator "muss"), optional (Operator "kann und darf nicht"), oder unzulässig (Operator "darf nicht"), und kein Satz fällt in mehr als eine dieser drei Kategorien.
Außerdem ist die zulässig ("kann"-Operator) sind Sätze, die obligatorisch oder fakultativ sind, die unzulässig ("darf nicht"-Operator) sind Sätze, die unzulässig oder optional sind, und die nicht fakultativ (Operator "muss oder darf nicht") sind Sätze, die obligatorisch oder unzulässig sind.
Insbesondere ist ein obligatorischer Satz zulässig, und ein unzulässiger Satz ist unzulässig.
Wendet man diese Operatoren auf den Satz "Die Methode wird außer Kraft gesetzt" an, so ergeben sich die folgenden Sätze:
- abstrakte (reine)/konkrete Methode: die Methode muss überschrieben werden/kann nicht überschrieben werden;
- virtuelle/reale (finale) Methode: die Methode darf überschrieben werden/ darf nicht überschrieben werden.
Insbesondere ist eine abstrakte Methode virtuell und eine reale Methode konkret.
Nach meinem Verständnis:
Abstrakte Methoden:
Nur die abstrakte Klasse kann abstrakte Methoden enthalten. Auch die abgeleitete Klasse muss die Methode implementieren, und in der Klasse ist keine Implementierung vorgesehen.
Virtuelle Methoden:
Eine Klasse kann diese deklarieren und auch die Implementierung derselben bereitstellen. Auch die abgeleitete Klasse muss die Methode implementieren, um sie außer Kraft zu setzen.
- See previous answers
- Weitere Antworten anzeigen