wake-up-neo.com

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

Was ist der Unterschied zwischen einer abstrakten Funktion und einer virtuellen Funktion? In welchen Fällen wird die Verwendung von virtuellen oder abstrakten Elementen empfohlen? Welcher ist der beste Ansatz? 

1406
Moran Helman

Eine abstrakte Funktion kann keine Funktionalität haben. Sie sagen im Grunde, jede Kindklasse MUSS ihre eigene Version dieser Methode angeben, es ist jedoch zu allgemein, um überhaupt versuchen zu können, sie in der Elternklasse zu implementieren. 

Eine virtuelle Funktion sagt im Wesentlichen Look, hier ist die Funktionalität, die für die Kindklasse möglicherweise gut genug ist. Wenn es gut genug ist, verwenden Sie diese Methode, wenn nicht, überschreiben Sie mich und stellen Sie Ihre eigenen Funktionen bereit.

2477
BFree

Eine abstrakte Funktion hat keine Implementierung und kann nur für eine abstrakte Klasse deklariert werden. Dadurch wird die abgeleitete Klasse gezwungen, eine Implementierung bereitzustellen. Eine virtuelle Funktion stellt eine Standardimplementierung bereit und kann auf einer abstrakten Klasse oder einer nicht abstrakten Klasse vorhanden sein. Also zum Beispiel:

public abstract class myBase
{
    //If you derive from this class you must implement this method. notice we have no method body here either
    public abstract void YouMustImplement();

    //If you derive from this class you can change the behavior but are not required to
    public virtual void YouCanOverride()
    { 
    }
}

public class MyBase
{
   //This will not compile because you cannot have an abstract method in a non-abstract class
    public abstract void YouMustImplement();
}
264
JoshBerke
  1. Nur abstract Klassen können abstract Mitglieder haben.
  2. Eine nicht -abstract Klasse, die von einer abstract Klasse mustoverride deren abstract Mitglieder erbt.
  3. Ein abstract Member ist implizit virtual.
  4. Ein abstract Member kann keine Implementierung bereitstellen (abstract wird in einigen Sprachen pure virtual genannt).
75
Mehrdad Afshari

Sie müssen immer eine abstrakte Funktion überschreiben.

Somit:

  • Abstrakte Funktionen - wenn der Erbe seine eigene Implementierung bereitstellen muss
  • Virtuell - wenn es ist dem Erben überlassen zu entscheiden
57
Rinat Abdullin

Abstrakte Funktion:

  1. Es kann nur in abstrakten Klassen deklariert werden. 
  2. Es enthält nur die Methodendeklaration, nicht die Implementierung in der abstrakten Klasse. 
  3. Es muss in abgeleiteten Klassen überschrieben werden.

Virtuelle Funktion:

  1. Es kann sowohl in abstrakten als auch in nicht abstrakten Klassen deklariert werden.
  2. Es enthält die Methodenimplementierung.
  3. Es kann überschrieben werden.
34
Lexnim

Abstrakte Methode: Wenn eine Klasse eine abstrakte Methode enthält, muss diese Klasse als abstrakt deklariert werden. Die abstrakte Methode ist nicht implementiert. Daher müssen Klassen, die von dieser abstrakten Klasse abgeleitet sind, eine Implementierung für diese abstrakte Methode bereitstellen.

Virtuelle Methode: Eine Klasse kann eine virtuelle Methode haben. Die virtuelle Methode hat eine Implementierung. Wenn Sie von einer Klasse mit einer virtuellen Methode erben, können Sie können die virtuelle Methode überschreiben und zusätzliche Logik bereitstellen oder die Logik durch Ihre eigene Implementierung ersetzen.

Wann verwenden: In einigen Fällen wissen Sie, dass bestimmte Typen eine bestimmte Methode haben sollten, aber Sie wissen nicht, welche Implementierung diese Methode haben sollte.
In solchen Fällen können Sie eine Schnittstelle erstellen, die eine Methode mit dieser Signatur enthält. Wenn Sie jedoch einen solchen Fall haben, aber wissen, dass die Implementierer dieser Schnittstelle auch über eine andere gemeinsame Methode verfügen (für die Sie die Implementierung bereits bereitstellen können), können Sie eine abstrakte Klasse erstellen. Diese abstrakte Klasse enthält dann die abstrakte Methode (die überschrieben werden muss) und eine andere Methode, die die 'gemeinsame' Logik enthält.

Eine virtuelle Methode sollte verwendet werden, wenn Sie über eine Klasse verfügen, die direkt verwendet werden kann, für die Sie jedoch möchten, dass Erben in der Lage sind, ein bestimmtes Verhalten zu ändern, obwohl dies nicht vorgeschrieben ist.

29

erklärung: mit Analogien. hoffentlich wird es dir helfen.

Kontext

Ich arbeite im 21. Stock eines Gebäudes. Und ich bin paranoid über Feuer. Hin und wieder brennt irgendwo auf der Welt ein Wolkenkratzer nieder. Aber zum Glück haben wir hier irgendwo eine Anleitung, was im Brandfall zu tun ist:

Notausgang()

  1. Sammle keine Sachen
  2. Gehen Sie, um zu entkommen
  3. Verlasse das Gebäude

Dies ist im Grunde eine virtuelle Methode namens FireEscape ()

Virtuelle Methode

Dieser Plan ist für 99% der Umstände ziemlich gut. Es ist ein grundlegender Plan, der funktioniert. Es besteht jedoch eine Chance von 1%, dass der Fluchtweg blockiert oder beschädigt ist. In diesem Fall sind Sie vollständig verschraubt und Sie werden Toast, wenn Sie nicht drastische Maßnahmen ergreifen. Mit virtuellen Methoden können Sie genau das tun: Sie können den grundlegenden FireEscape () - Plan mit Ihrer eigenen Version des Plans überschreiben:

  1. Zum Fenster laufen
  2. Spring aus dem Fenster
  3. Fallschirm sicher nach unten

Mit anderen Worten: virtuelle Methoden stellen einen grundlegenden Plan bereit, der bei Bedarf überschrieben werden kann. Unterklassen können die virtuelle Methode der übergeordneten Klasse überschreiben, wenn der Programmierer dies für angemessen hält.

Abstrakte Methoden

Nicht alle Organisationen sind gut ausgebildet. Einige Organisationen führen keine Brandschutzübungen durch. Sie haben keine generelle Fluchtpolitik. Jeder Mann ist für sich. Das Management ist nur an einer solchen Politik interessiert.

Mit anderen Worten, jede Person ist gezwungen, ihre eigene FireEscape () - Methode zu entwickeln. Ein Typ wird die Feuerleiter verlassen. Ein anderer Typ fällt mit dem Fallschirm ab. Ein anderer Typ wird Raketenantriebstechnologie einsetzen, um vom Gebäude wegzufliegen. Ein anderer Typ wird sich abseilen. Dem Management ist es egal, wie Sie entkommen, solange Sie einen grundlegenden FireEscape () - Plan haben. Wenn dies nicht der Fall ist, können Sie sicher sein, dass OHS wie eine Tonne Ziegelsteine ​​in die Organisation kommt. Dies ist, was mit einer abstrakten Methode gemeint ist. 

Was ist der Unterschied zwischen den beiden wieder?

Abstrakte Methode: Unterklassen sindforced, um ihre eigene FireEscape-Methode zu implementieren. Mit einer virtuellen Methode warten Sie auf einen grundlegenden Plan. Sie können jedoch zur Implementierung Ihrer eigenen wählen, falls dies nicht gut genug ist.

Nun war das nicht so schwer, oder?

25
BKSpurgeon

Eine abstrakte Methode ist eine Methode, die implementiert werden muss, um eine konkrete Klasse zu erstellen. Die Deklaration befindet sich in der abstrakten Klasse (und jede Klasse mit einer abstrakten Methode muss eine abstrakte Klasse sein) und muss in einer konkreten Klasse implementiert werden.

Eine virtuelle Methode ist eine Methode, die in einer abgeleiteten Klasse überschrieben werden kann, indem das Überschreiben, Ersetzen das Verhalten in der Superklasse verwendet wird. Wenn Sie nicht überschreiben, erhalten Sie das ursprüngliche Verhalten. Wenn Sie dies tun, erhalten Sie immer das neue Verhalten. Dies steht im Gegensatz zu nicht virtuellen Methoden, die nicht überschrieben werden können, sondern die ursprüngliche Methode ausblenden können. Dies geschieht mit dem Modifikator new.

Siehe folgendes Beispiel:

public class BaseClass
{
    public void SayHello()
    {
        Console.WriteLine("Hello");
    }


    public virtual void SayGoodbye()
    {
        Console.WriteLine("Goodbye");
    }

    public void HelloGoodbye()
    {
        this.SayHello();
        this.SayGoodbye();
    }
}


public class DerivedClass : BaseClass
{
    public new void SayHello()
    {
        Console.WriteLine("Hi There");
    }


    public override void SayGoodbye()
    {
        Console.WriteLine("See you later");
    }
}

Wenn ich DerivedClass instanziiere und SayHello oder SayGoodbye anrufe, erhalte ich "Hi There" und "Bis später". Wenn ich HelloGoodbye anrufe, bekomme ich "Hallo" und "Bis später". Dies liegt daran, dass SayGoodbye virtuell ist und durch abgeleitete Klassen ersetzt werden kann. SayHello ist nur ausgeblendet. Wenn ich das also von meiner Basisklasse aus anrufe, bekomme ich meine ursprüngliche Methode.

Abstrakte Methoden sind implizit virtuell. Sie definieren Verhalten, das vorhanden sein muss, eher wie eine Schnittstelle.

22
Kamiel Wanrooij

Abstrakte Methoden sind immer virtuell. Sie können keine Implementierung haben.

Das ist der Hauptunterschied.

Grundsätzlich würden Sie eine virtuelle Methode verwenden, wenn Sie über die 'Standard'-Implementierung verfügen und Nachkommen das Verhalten ändern möchten.

Mit einer abstrakten Methode zwingen Sie Nachkommen, eine Implementierung bereitzustellen.

10
Rashack

Ich habe das einfacher gemacht, indem ich einige Verbesserungen an den folgenden Klassen vorgenommen habe (aus anderen Antworten):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestOO
{
    class Program
    {
        static void Main(string[] args)
        {
            BaseClass _base = new BaseClass();
            Console.WriteLine("Calling virtual method directly");
            _base.SayHello();
            Console.WriteLine("Calling single method directly");
            _base.SayGoodbye();

            DerivedClass _derived = new DerivedClass();
            Console.WriteLine("Calling new method from derived class");
            _derived.SayHello();
            Console.WriteLine("Calling overrided method from derived class");
            _derived.SayGoodbye();

            DerivedClass2 _derived2 = new DerivedClass2();
            Console.WriteLine("Calling new method from derived2 class");
            _derived2.SayHello();
            Console.WriteLine("Calling overrided method from derived2 class");
            _derived2.SayGoodbye();
            Console.ReadLine();
        }
    }


    public class BaseClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello\n");
        }
        public virtual void SayGoodbye()
        {
            Console.WriteLine("Goodbye\n");
        }

        public void HelloGoodbye()
        {
            this.SayHello();
            this.SayGoodbye();
        }
    }


    public abstract class AbstractClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello\n");
        }


        //public virtual void SayGoodbye()
        //{
        //    Console.WriteLine("Goodbye\n");
        //}
        public abstract void SayGoodbye();
    }


    public class DerivedClass : BaseClass
    {
        public new void SayHello()
        {
            Console.WriteLine("Hi There");
        }

        public override void SayGoodbye()
        {
            Console.WriteLine("See you later");
        }
    }

    public class DerivedClass2 : AbstractClass
    {
        public new void SayHello()
        {
            Console.WriteLine("Hi There");
        }
        // We should use the override keyword with abstract types
        //public new void SayGoodbye()
        //{
        //    Console.WriteLine("See you later2");
        //}
        public override void SayGoodbye()
        {
            Console.WriteLine("See you later");
        }
    }
}
10
MeqDotNet

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

Late Bindung bedeutet, dass wir den Namen verwenden, aber das Mapping verschieben. Mit anderen Worten, wir erstellen/erwähnen zuerst den Namen und lassen einen nachfolgenden Prozess die Zuordnung von Code zu diesem Namen durchführen.

Nun bedenken Sie:

  • Im Vergleich zum Menschen können Maschinen wirklich gut suchen und sortieren
  • Im Vergleich zu Maschinen kann der Mensch wirklich gut mit Erfindungen und Innovationen umgehen

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

Mit anderen Worten bedeutet virtual:

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

Während abstract bedeutet:

“Sehr geehrter Programmierer , bitte binden Sie den entsprechenden Code an diesen Namen, indem Sie das tun, was Sie am besten können: erfindung

Der Vollständigkeit halber bedeutet Überladen:

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

5
Rodrick Chapman

Virtuelle Methode :

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

  • Virtuelle Funktion hat eine Implementierung. Wenn wir die Klasse erben, können wir Die virtuelle Funktion überschreiben und unsere eigene Logik bereitstellen. 

  • Wir können den Rückgabetyp der virtuellen Funktion während der Implementierung von ändern
    Funktion in der Kindklasse (was als Begriff von
    Shadowing).

Abstrakte Methode

  • Abstract bedeutet, wir MÜSSEN es außer Kraft setzen. 

  • Eine abstrakte Funktion hat keine Implementierung und muss sich in einer abstrakten Klasse befinden.

  • Es kann nur erklärt werden. Dadurch wird die abgeleitete Klasse gezwungen, die Implementierung bereitzustellen. 

  • Ein abstraktes Mitglied ist implizit virtuell. Das Abstract 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;
        }
    } 
    
3
flik

Sie verwenden im Grunde eine virtuelle Methode, wenn die Vererbung die Funktionalität erweitern soll, wenn Sie möchten.

Sie verwenden abstrakte Methoden, wenn die Erben die Funktionalität implementieren sollen (und in diesem Fall haben sie keine Wahl).

3
Brann

Ich habe an einigen Stellen gesehen, dass die abstrakte Methode wie folgt definiert ist. **

"Eine abstrakte Methode muss in der Kindklasse implementiert werden"

** Ich hatte das Gefühl, dass es so ist.

Es ist nicht erforderlich, dass eine abstrakte Methode in einer untergeordneten Klasse implementiert wird, wenn die untergeordnete Klasse auch abstrakt ist .. 

1) Eine abstrakte Methode cant ist eine private Methode . 2) Eine abstrakte Methode cant kann in derselben abstrakten Klasse implementiert werden.

Ich würde sagen ... Wenn wir eine abstrakte Klasse implementieren, müssen Sie die abstrakten Methoden aus der abstrakten Basisklasse überschreiben. Weil .. Die abstrakte Methode implementiert wird mit override key Word. Ähnlich wie bei Virtual Methode.

Es ist nicht erforderlich, 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();
    }
}
3
Kodoth

Die meisten der oben genannten Beispiele verwenden Code - und sie sind sehr, sehr gut. Ich muss nicht hinzufügen, was sie sagen, aber das Folgende ist eine einfache Erklärung, die Analogien anstelle von Code/technischen Begriffen verwendet.

Einfache Erklärung - Erklärung mit Analogien

Abstrakte Methode

Denken Sie an George W. Bush. Er sagt zu seinen Soldaten: "Geh kämpfen im Irak". Und das ist es. Alles, was er angegeben hat, ist, dass gekämpft werden muss. Er gibt nicht an , wie genau das geschehen soll. Aber ich meine, man kann nicht einfach rausgehen und "kämpfen": Was bedeutet das genau? kämpfe ich mit einem B-52 oder meinem Derringer? Diese spezifischen Details bleiben jemand anderem überlassen. Dies ist eine abstrakte Methode.

Virtuelle Methode

David Petraeus ist hoch in der Armee. Er hat definiert, was Kampf bedeutet:

  1. Finde den Feind
  2. Neutralisiere ihn.
  3. Trinken Sie danach ein Bier

Das Problem ist, dass es eine sehr allgemeine Methode ist. 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.

Private Job Bloggs liest den Auftrag von Petraeus und erhält die Erlaubnis, seine eigene Version von fight gemäß seinen besonderen Anforderungen zu implementieren:

  1. Finde den Feind.
  2. Erschieße ihn in den Kopf.
  3. Nach Hause gehen
  4. Bier trinken.

Nouri al Maliki erhält die gleichen Aufträge auch von Petraeus. Er soll auch kämpfen. Aber er ist ein Politiker, kein Infanterist. Offensichtlich kann er seine politischen Feinde nicht in den Kopf schießen. Da Petraeus ihm eine virtuelle Methode gegeben hat, kann Maliki seine eigene Version der Kampfmethode entsprechend seinen besonderen Umständen implementieren:

  1. Finde den Feind.
  2. Lassen Sie ihn mit einigem BS verhaften, der Anklage erfunden hat.
  3. Nach Hause gehen
  4. Bier trinken.

Mit anderen Worten, eine virtuelle Methode liefert Anweisungen für das Boilerplate. Hierbei handelt es sich jedoch um allgemeine Anweisungen, die von Personen in der gesamten Heereserbschaft je nach den jeweiligen Umständen präzisiert werden können.

Der Unterschied zwischen den beiden

  • George Bush weist keine Implementierungsdetails nach. Dies muss von jemand anderem bereitgestellt werden. Dies ist eine abstrakte Methode.

  • Petraeus hingegen stellt Implementierungsdetails zur Verfügung, hat jedoch seinen Untergebenen die Erlaubnis erteilt, seine Befehle mit ihrer eigenen Version zu überschreiben, sofern diese verfügbar sind etwas Besseres.

ich hoffe, das hilft.

2
BKSpurgeon

Abstrakte Funktion kann keinen Körper haben und MUSS von untergeordneten Klassen überschrieben werden

Virtuelle Funktion hat einen Hauptteil und kann durch untergeordnete Klassen überschrieben werden

2

Abstrakte Funktion (Methode):

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

● Es hat keinen Körper.

● Es sollte von der abgeleiteten Klasse implementiert werden.

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

virtuelle Funktion (Methode):

● Eine virtuelle Methode ist die Methode, die mit dem Schlüsselwort virtual deklariert wird und von der abgeleiteten Klassenmethode mit dem Überschreibungsschlüsselwort überschrieben werden kann.

● Es liegt an der abgeleiteten Klasse, ob sie überschrieben werden soll oder nicht.

2
Kedarnath M S

Eine abstrakte Methode hat keine Implementierung. Sie ist in der übergeordneten Klasse deklariert. Die untergeordnete Klasse ist für die Implementierung dieser Methode verantwortlich.

Die virtuelle Methode sollte über eine Implementierung in der übergeordneten Klasse verfügen. Dadurch kann die untergeordnete Klasse die Wahl treffen, ob sie diese Implementierung der übergeordneten Klasse verwenden oder eine neue Implementierung für diese Methode in der untergeordneten Klasse erstellen soll.

1
Vinay Chanumolu

Eine abstrakte Funktion ist "nur" eine Signatur ohne Implementierung . Sie wird in einer Schnittstelle verwendet, um die Verwendung der Klasse zu definieren . Sie muss in einer der abgeleiteten Klassen implementiert werden.

Virtuelle Funktion (eigentlich Methode) ist eine Funktion, die Sie ebenfalls deklarieren. Sie sollte in einer der Vererbungshierarchieklassen implementiert werden.

Die geerbten Instanzen einer solchen Klasse erben auch die Implementierung, sofern Sie sie nicht implementieren, in einer niedrigeren Hierarchieklasse.

1
Sagi Berco

Aus allgemeiner objektorientierter Sicht:

Bezüglich abstrakter Methoden : Wenn Sie eine abstrakte Methode in die übergeordnete Klasse einfügen, sagen Sie eigentlich zu den untergeordneten Klassen: Beachten Sie, dass Sie eine Methodensignatur wie diese haben. Und wenn Sie es verwenden wollen, sollten Sie Ihr eigenes implementieren!

Zur virtuellen Funktion : Wenn Sie eine virtuelle Methode in die übergeordnete Klasse einfügen, sagen Sie zu den abgeleiteten Klassen: Hey, hier gibt es eine Funktionalität, die etwas für Sie tut. Wenn dies für Sie nützlich ist, verwenden Sie es einfach. Wenn nicht, überschreiben Sie dies und implementieren Sie Ihren Code. Sie können sogar meine Implementierung in Ihrem Code verwenden!

Dies ist eine Philosophie über die Unterschiede zwischen diesen beiden Konzepten in General OO

1

Die Antwort wurde mehrmals gegeben, aber die Frage, wann sie verwendet werden soll, ist eine Entwurfszeitentscheidung. Ich würde es als gute Praxis ansehen, zu versuchen, gängige Methodendefinitionen in verschiedenen Schnittstellen zu bündeln und sie auf geeigneten Abstraktionsebenen in Klassen zu ziehen. Durch das Ablegen eines gemeinsamen Satzes abstrakter und virtueller Methodendefinitionen in eine Klasse ist die Klasse unbestimmt, wenn es am besten ist, eine nicht abstrakte Klasse zu definieren, die einen Satz präziser Schnittstellen implementiert. Wie immer hängt es davon ab, was für Ihre spezifischen Anwendungen am besten geeignet ist.

1
ComeIn

In C # gibt es nichts namens virtuelle Klasse.

Für Funktionen

  1. Abstrakte Funktion hat nur Signatur, die Laufwerksklasse sollte mit Funktionalität überschrieben werden.
  2. Die virtuelle Funktion enthält den Teil der Funktionalität, den die Laufwerksklasse je nach Anforderung überschreiben kann

Sie können mit Ihrer Anforderung entscheiden.

Von einem C++ - Hintergrund aus entspricht C # virtual der virtuellen C++, während abstrakte C # -Methoden der rein virtuellen C++ - Funktion entsprechen

0
Yituo

Hier schreibe ich einen Beispielcode, in der Hoffnung, dass dies ein ziemlich greifbares Beispiel ist, um das Verhalten der Interfaces, abstrakten Klassen und gewöhnlichen Klassen auf einer sehr einfachen 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(){
    //
    //    }
    }
}
0
U.Savas

Eine abstrakte Funktion oder Methode ist ein öffentlicher "Operationsname", der von einer Klasse verfügbar gemacht wird. Ihr Ziel ist, zusammen mit abstrakten Klassen, in erster Linie eine Form der Einschränkung im Objektentwurf gegenüber der Struktur, die ein Objekt implementieren muss. 

In der Tat müssen die Klassen, die von ihrer abstrakten Klasse erben, dieser Methode eine Implementierung geben. Compiler erzeugen im Allgemeinen Fehler, wenn sie dies nicht tun.

Die Verwendung abstrakter Klassen und Methoden ist in erster Linie wichtig, um zu vermeiden, dass durch das Konzentrieren auf Implementierungsdetails beim Entwerfen von Klassen die Klassenstruktur zu stark auf die Implementierungen bezogen wird, sodass Abhängigkeiten und Kopplungen zwischen Klassen entstehen, die zwischen ihnen zusammenarbeiten.

Eine virtuelle Funktion oder Methode ist einfach eine Methode, die ein öffentliches Verhalten einer Klasse modelliert, die wir jedoch in der Vererbungskette ändern können, da wir der Meinung sind, dass untergeordnete Klassen bestimmte Erweiterungen implementieren müssen für dieses Verhalten.

Beide repräsentieren eine Form von Polymorpfhismus im Objektorientierungsparadigma. 

Wir können abstrakte Methoden und virtuelle Funktionen zusammen verwenden, um ein gutes Vererbungsmodell zu unterstützen.

Wir entwerfen eine gute abstrakte Struktur der Hauptobjekte unserer Lösung. Anschließend erstellen wir grundlegende Implementierungen, indem wir diejenigen ausfindig machen, die für weitere Spezialisierungen anfällig sind, und wir machen diese als virtuelle Objekte. Schließlich spezialisieren wir uns auf unsere grundlegenden Implementierungen.

0
Ciro Corvino