Frage

Was ist der Unterschied zwischen einer abstrakten Funktion und einer virtuellen Funktion? In welchen Fällen ist es virtuell oder abstrakt zu verwenden, zu empfehlen? Welches ist der beste Ansatz?

War es hilfreich?

Lösung

Eine abstrakte Funktion kann nicht Funktionalität. Sie sagen, im Grunde, muss jedes Kind Klasse ihre eigene Version dieser Methode geben, aber zu allgemein ist es noch versuchen, in der übergeordneten Klasse zu implementieren.

Eine virtuelle Funktion , sagt im Grunde sehen, hier ist die Funktionalität, die nicht gut genug für das Kind Klasse sein kann. Also, wenn es gut genug ist, diese Methode verwenden, wenn nicht, dann überschreibt mich und Ihre eigene Funktionalität.

Andere Tipps

Eine abstrakte Funktion hat keine UMSETZUNG und es kann nur auf einer abstrakte Klasse deklariert werden. Dies zwingt die abgeleitete Klasse eine Implementierung zur Verfügung zu stellen.

Eine virtuelle Funktion stellt eine Implementierung Standard und kann entweder auf einer abstrakten Klasse oder eine nicht-abstrakte Klasse existiert.

So 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();
}
  1. Nur abstract Klassen können abstract Mitglieder haben.
  2. Eine nicht abstract Klasse, die von einer abstract Klasse erbt muss override seine abstract Mitglieder.
  3. Ein abstract Mitglied wird implizit virtual.
  4. Ein abstract Mitglied kann jede Implementierung nicht zur Verfügung stellen (abstract pure virtual in einigen Sprachen genannt wird).

Sie müssen immer eine abstrakte Funktion außer Kraft setzen.

So:

  • Abstrakte Funktionen - wenn die Erbin muss ihre eigene Implementierung bieten
  • Virtuelle - wenn es bis zum inheritor ist zu entscheiden,

Zusammenfassung Funktion:

  1. Es kann nur innerhalb abstrakte Klasse deklariert werden.
  2. Sie enthält nur Methodendeklaration nicht die Umsetzung in der abstrakten Klasse.
  3. Sie muss in abgeleiteten Klasse überschrieben werden.

Virtuelle Funktion:

  1. Es kann innerhalb abstrakt als auch nicht abstrakte Klasse deklariert werden.
  2. Sie enthält Methodenimplementierung.
  3. Es kann außer Kraft gesetzt werden.

Abstrakte Methode: Wenn eine Klasse eine abstrakte Methode enthält, muss diese Klasse als abstrakt deklariert werden. Die abstrakte Methode hat keine Implementierung und somit Klassen, die von dieser abstrakten Klasse abgeleitet wird, muss eine Implementierung für diese abstrakte Methode zur Verfügung stellen.

Virtuelle Methode: Eine Klasse kann eine virtuelle Methode hat. Die virtuelle Methode hat eine Implementierung. Wenn Sie von einer Klasse erben, die eine virtuelle Methode hat, Sie kann die virtuelle Methode überschreibt und eine zusätzliche Logik zur Verfügung stellen, oder die Logik mit Ihrer eigenen Implementierung ersetzen.

Wenn verwenden, was: In einigen Fällen wissen Sie, dass bestimmte Arten eine bestimmte Methode haben sollten, aber Sie wissen nicht, welche Implementierung sollte diese Methode haben.
In solchen Fällen können Sie eine Schnittstelle erstellen, die ein Verfahren mit dieser Signatur enthält. Wenn Sie einen solchen Fall jedoch haben, aber Sie wissen, dass Implementierer dieser Schnittstelle wird auch eine andere übliche Methode haben (für das Sie die Implementierung bereits zur Verfügung stellen kann), können Sie eine abstrakte Klasse erstellen. Diese abstrakte Klasse enthält dann die abstrakte Methode (die außer Kraft gesetzt werden muss), und ein anderes Verfahren, das die ‚gemeinsame‘ Logik enthält.

Eine virtuelle Methode solle verwendet werden, wenn Sie eine Klasse, die direkt verwendet werden kann, aber für die Sie Nachfolger eines bestimmtes Verhalten ändern können, auch wenn es nicht zwingend notwendig ist.

Erklärung: mit Analogien. hoffentlich wird es Ihnen helfen.

Kontext

Ich arbeite am 21. Etage eines Gebäudes. Und ich bin paranoid über Feuer. Hin und wieder, irgendwo in der Welt, ein Feuer brennt einen Wolkenkratzers nach unten. Aber zum Glück haben wir eine Anleitung irgendwo hier auf dem, was im Brandfall zu tun:

Fireescape ()

  1. Sie nicht sammeln Habseligkeiten
  2. Gehen Flucht Feuer
  3. Gehen Sie aus den Gebäuden

Dies ist im Grunde eine virtuelle Methode namens Fireescape ()

Virtuelle Methode

Dieser Plan ist ziemlich gut für 99% der Umstände. Es ist ein grundlegender Plan, der funktioniert. Aber es gibt eine 1% ige Chance, dass der Feuerleiter blockiert oder beschädigt, in dem Fall, dass Sie vollständig eingeschraubt sind, und Sie werden Toast werden, wenn Sie einige drastischen Maßnahmen ergreifen. Mit virtuellen Methoden können Sie genau das zu tun: Sie haben die Grundfireescape () Plan mit Ihrer eigenen Version des Plans überschreiben können:

  1. Ausführen auf Fenster
  2. Sprung aus dem Fenster
  3. Parachute sicher auf den Boden

Mit anderen Worten: virtuelle Methoden ein grundsätzliches Plan, der außer Kraft gesetzt werden kann, wenn Sie benötigen . Subklassen kann die Elternklasse virtuelle Methode überschreibt, wenn der Programmierer es für angemessen hält.

Abstrakte Methoden

Nicht alle Organisationen sind gut gebohrt. Einige Organisationen nicht tun Brandschutzübungen. Sie haben nicht eine allgemeine Flucht Politik. Jeder Mensch ist für sich selbst. Management sind nur daran interessiert, eine solche Politik vorhanden ist.

Mit anderen Worten, jede Person gezwungen seine eigene Fireescape () Methode zu entwickeln. Ein Mann wird den Feuerleiter zu Fuß aus. Ein weiterer Mann wird Fallschirm. Ein weiterer Mann wird Raketenantriebstechnik verwenden, um von dem Gebäude weg zu fliegen. Ein weiterer Mann wird Abseilen aus. Management do not care wie Sie entkommen, so lange, wie Sie eine grundlegende Fireescape () Plan haben - wenn sie es nicht tun Sie garantiert werden kann OHS wird fallen auf die Organisation wie eine Tonne Ziegelsteine. Das ist mit einer abstrakten Methode gemeint ist.

Was ist der Unterschied zwischen den beiden wieder?

Zusammenfassung Methode: sub-Klassen sind gezwungen eigene Fireescape Methode zu implementieren. Mit einer virtuellen Methode haben Sie einen grundlegenden Plan auf Sie warten, kann aber wählen implementieren Ihre eigenen , wenn es nicht gut genug.

Nun, das war nicht so schwer war es?

Eine abstrakte Methode ist eine Methode, die eine konkrete Klasse machen umgesetzt werden muß. Die Erklärung ist in der abstrakten Klasse (und jede Klasse mit einer abstrakten Methode muss eine abstrakte Klasse sein) und es muss in einer konkreten Klasse implementiert werden.

eine virtuelle Methode ist eine Methode, die in einer abgeleiteten Klasse mit der Überschreibung außer Kraft gesetzt werden kann, ersetzt , um das Verhalten in der übergeordneten Klasse. Wenn Sie nicht außer Kraft setzen, erhalten Sie das ursprüngliche Verhalten. Wenn Sie das tun, erhalten Sie immer das neue Verhalten. Diese nicht virtuelle Methoden gegenüber, die nicht außer Kraft gesetzt werden kann, aber die ursprüngliche Methode verbergen. Dies geschieht, um den new Modifikator verwendet wird.

Siehe das folgende 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 und Call SayHello instanziiert oder SayGoodbye, erhalte ich „Hallo There“ und „Bis später“. Wenn ich HelloGoodbye nennen, erhalte ich „Hallo“ und „Bis später“. Dies liegt daran, SayGoodbye virtuell ist, und kann von abgeleiteten Klassen ersetzt werden. SayHello ist nur versteckt, so dass, wenn ich das von meiner Basisklasse aufrufen ich meine ursprüngliche Methode.

Abstrakte Methoden sind implizit virtuell. Sie definieren das Verhalten, die vorhanden sein müssen, eher wie eine Schnittstelle der Fall ist.

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

Das ist der Hauptunterschied.

Grundsätzlich würden Sie eine virtuelle Methode verwenden, wenn Sie die ‚default‘ Implementierung davon und wollen Nachkommen ermöglichen, sein Verhalten zu ändern.

Mit einer abstrakten Methode, zwingen Sie Nachkomme eine Implementierung zur Verfügung zu stellen.

Ich habe diese einfacher durch einige Verbesserungen auf den folgenden Klassen machen (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");
        }
    }
}

Die Bindung ist der Prozess, einen Namen zu einer Einheit von Code abzubilden.

Späte Bindung bedeutet, dass wir den Namen verwenden, aber die Abbildung verschieben. Mit anderen Worten, wir schaffen / erwähnen den Namen zuerst, und lassen einige nachfolgende Prozess der Zuordnung von Code zu diesem Namen handhaben.

Nun betrachten:

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

So ist die kurze Antwort ist: virtual eine späte Bindung Anweisung für die Maschine (Laufzeit), während abstract die späte Bindung Anweisung für den Mensch ist (Programmierer)

Mit anderen Worten, virtual bedeutet:

„Lieber Laufzeit , binden den entsprechenden Code zu diesem Namen zu tun, was Sie am besten können: Suche

Während abstract bedeutet:

„Lieber Programmierer , benutzen Sie bitte den entsprechenden Code zu diesem Namen binden zu tun, was Sie am besten können: Erfinden

Aus Gründen der Vollständigkeit, Überlastung bedeutet:

„Lieber Compiler , binden den entsprechenden Code zu diesem Namen zu tun, was Sie am besten können: Sortierung “.

Sie im Grunde eine virtuelle Methode verwenden, wenn Sie die Erben wollen die Funktionalität zu erweitern, wenn sie wollen.

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

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

  

"Eine abstrakte Methode muss in der untergeordneten Klasse implementieren"

** Ich spürte, wie es ist.

Es ist nicht notwendig, dass eine abstrakte Methode in einer untergeordneten Klasse implementiert werden muss, , wenn das Kind Klasse auch abstrakt ..

1) Eine abstrakte Methode Überhöhung eine private Methode. 2) Eine abstrakte Methode Überhöhung in der gleichen abstrakten Klasse implementiert werden.

Ich würde sagen, ..wenn wir eine abstrakte Klasse implementieren, müssen Sie die abstrakten Methoden von der Basis abstrakten Klasse außer Kraft setzen müssen. Da .. Die Implementierung die abstrakte Methode ist mit Überschreibung Schlüsselwort .Similar auf virtuelle Methode.

Es ist nicht notwendig für eine virtuelle Methode in einer geerbten Klasse umgesetzt werden.

                                 ----------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();
    }
}

Virtuelle Methode :

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

  • Virtual Function hat eine Implementierung. Wenn wir erben die Klasse, die wir kann die virtuelle Funktion außer Kraft setzen und unsere eigene Logik zur Verfügung stellen.

  • Wir können den Rückgabetyp der virtuellen Funktion ändern, während die
    Umsetzung Funktion in der Kinderklasse (das als ein Konzept der
    gesagt werden kann, Shadowing).

Abstrakte Methode

  • Abstrakt bedeutet wir müssen sie außer Kraft setzen.

  • Eine abstrakte Funktion nicht implementiert und in einer abstrakten Klasse sein muss.

  • Es kann nur deklariert werden. Dies zwingt die abgeleitete Klasse die Implementierung davon zur Verfügung zu stellen.

  • Ein abstraktes Mitglied ist implizit virtuell. Die abstrakte kann als rein virtuelle in einige der Sprachen aufgerufen werden.

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

Abstrakte Funktion kann nicht einen Körper haben und müssen von untergeordneten Klassen außer Kraft gesetzt werden

Virtual Function wird einen Körper haben und kann oder auch nicht von untergeordneten Klassen außer Kraft gesetzt werden

Die meisten der obigen Beispiele verwenden Code - und sie sind sehr sehr gut. Ich brauche hinzufügen nicht, was sie sagen, aber die folgende ist eine einfache Erklärung, die eher die Verwendung von Analogien macht als Code / Fachbegriffe.

Einfache Erklärung - Erklärung mit Analogien

Abstrakte Methode

Denken Sie George W Bush. Er sagt zu seinen Soldaten: „Gehen Sie im Irak kämpfen“. Und das ist es. Alles, was er angegeben hat, ist, dass der Kampf getan werden muss. Er gibt nicht an, wie genau das wird passieren. Aber ich meine, kann man nicht einfach gehen und „kämpfen“: was das genau bedeutet? kämpfe ich mit einer B-52 oder meinen derringer? Diese spezifischen Details zu jemandem anderen überlassen. Dies ist eine abstrakte Methode.

Virtuelle Methode

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

  1. Finden Sie den Feind
  2. Neutralisieren ihn.
  3. Haben Sie ein Bier danach

Das Problem ist, dass es eine sehr allgemeine Methode. Es ist eine gute Methode, die funktioniert, aber manchmal ist nicht spezifisch genug. Gute Sache für Petraeus ist, dass seine Befehle haben Spielraum und Umfang -. Er andere ändern darf seine Definition von „Kampf“, nach ihren speziellen Anforderungen hat

Privat Job Bloggs liest Petraeus' bestellen und die Erlaubnis gegeben, seine eigene Version von Kampf zu implementieren, nach seinen speziellen Anforderungen:

  1. Finden Feind.
  2. schießen ihm in den Kopf.
  3. Go Home
  4. Haben Sie Bier.

Nouri al Maliki erhält auch die gleichen Befehle von Petraeus. Er ist auch zu kämpfen. Aber er ist ein Politiker, kein Infanterie Mann. Natürlich kann er nicht gehen um seine politican Feinde in den Kopf zu schießen. Da Petraeus ihm eine virtuelle Methode gegeben hat, dann seine eigene Version der Kampf Methode, nach seinen besonderen Umständen Maliki kann implementieren:

  1. Finden Feind.
  2. Habe ihn mit einigen BS verhaftete Gebühren erfundene.
  3. Go Home
  4. Haben Sie Bier.

Mit anderen Worten, eine virtuelle Methode liefert vorformulierten Anweisungen -. Aber diese sind allgemeine Anweisungen, die von Menschen auf der Armee-Hierarchie präziser gemacht werden können, entsprechend ihren besonderen Umständen

Der Unterschied zwischen den beiden

  • George Bush beweisen keine Implementierungsdetails. Dies muss von jemandem anderen zur Verfügung gestellt werden. Dies ist eine abstrakte Methode.

  • Petraeus auf der anderen Seite hat Implementierungsdetails zur Verfügung stellen, aber er hat für seine Untergebenen die Erlaubnis gegeben, seine Befehle mit ihrer eigenen Version außer Kraft zu setzen, wenn sie besser etwas einfallen kann.

Hoffnung, das hilft.

Abstrakte Funktion (Methode):

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

● Es ist nicht Körper.

● Es sollte von der abgeleiteten Klasse implementiert werden.

● Wenn eine Methode abstrakt ist dann die Klasse sollte abstrakt.

virtuelle Funktion (Methode):

● Eine virtuelle Methode ist die Methode, die mit dem Schlüsselwort virtual deklariert und es kann durch die Verwendung Schlüsselwort override von der abgeleiteten Klasse Methode überschrieben werden.

● Es liegt an der abgeleiteten Klasse, ob es außer Kraft zu setzen oder nicht.

Die Antwort wird mehrfach angegeben, aber die die Frage, wann jeweils eine Entwurfszeit Entscheidung zu verwenden. Ich würde sieht es als gute Praxis zu versuchen, gemeinsame Methodendefinitionen in verschiedene Schnittstellen zu bündeln und in Klassen an geeigneten Abstraktionsebenen ziehen. Dumping einen gemeinsamen Satz von abstrakten und virtuellen Methodendefinitionen in eine Klasse macht die Klasse unistantiable, wenn es am besten sein, um eine nicht-abstrakte Klasse zu definieren, die eine Reihe von prägnanten Schnittstellen implementiert. Wie immer hängt es davon ab, was am besten Ihre Anwendungen spezifische Bedürfnisse.

Von allgemeiner objektorientierter Ansicht:

In Bezug auf abstrakte Methode : Wenn Sie eine abstrakte Methode in der Klasse Eltern setzen eigentlich Sie zu den untergeordneten Klassen sagen: Hey beachten Sie, dass Sie eine Methode Signatur wie diese haben. Und wenn Sie wollen, es zu benutzen, sollten Sie Ihre eigenen implementieren!

In Bezug auf virtuelle Funktion : Wenn Sie eine virtuelle Methode in der übergeordneten Klasse setzen Sie sich mit den abgeleiteten Klassen sagen werden: Hey gibt es eine Funktionalität hier, die etwas für Sie tun. Wenn dies nützlich für Sie nur verwenden. Wenn nicht, überschreiben diese und Ihren Code implementieren, auch können Sie meine Implementierung in Ihrem Code verwenden!

Das ist einige Philosophie über verschiedene zwischen diesen beiden Konzept im Allgemeinen OO

Es gibt nichts Anruf virtuelle Klasse in C #.

Für Funktionen

  1. Abstrakte Funktion hat nur Unterschrift nur, sollte der Antrieb Klasse mit Funktionalität außer Kraft setzen.
  2. Virtuelle Funktion den Teil der Funktionalität der Antriebs Klasse halten außer Kraft setzen kann oder nicht entsprechend der Anforderung

Sie können mit Ihrer Anforderung entscheiden.

Abstrakte Methode muß nicht ein implementation.It haben wird in der übergeordneten Klasse deklariert. Das Kind Klasse ist resposible für diese Methode zu implementieren.

Virtuelle Methode sollte eine Implementierung in der Elternklasse hat und es erleichtert das Kind Klasse die Wahl zu treffen, ob, dass die Umsetzung der übergeordneten Klasse verwenden oder eine neue Implementierung für sich für diese Methode in der Kinderklasse zu haben.

Eine abstrakte Funktion ist „nur“ eine Signatur, ohne Umsetzung. Es wird in einer Schnittstelle verwendet zu erklären, wie die Klasse verwendet werden kann. Es muss in einer der abgeleiteten Klassen implementiert werden.

Virtuelle Funktion (Methode tatsächlich) ist eine Funktion, die Sie erklären auch, und sollte in einer der Vererbungshierarchie Klassen implementiert.

Die vererbten Instanzen dieser Klasse, erben die Implementierung als auch, wenn Sie es implementieren, in einer niedrigeren Hierarchieklasse.

Von einem C ++ Hintergrund, C # virtuelle entspricht C ++ virtuell, während C # abstrakte Methoden entsprechen C ++ rein virtuelle Funktion

Eine abstrakte Funktion oder Methode ist eine öffentliche „Operation Name“ von einer Klasse ausgesetzt, ihr Ziel, zusammen mit abstrakten Klassen, bietet sich in erster Linie eine Form von Zwang in Objekten Design gegen die Struktur, die ein bezwecken zu implementieren.

In der Tat die Klassen, die von seiner abstrakten Klasse erben haben eine Implementierung diese Methode zu geben, Compiler im Allgemeinen Fehler zu erhöhen, wenn sie es nicht tun.

Mit abstrakten Klassen und Methoden wichtig ist vor allem zu vermeiden, dass durch die Konzentration auf Details der Implementierung, wenn Klassen der Gestaltung die Struktur Klassen zu im Zusammenhang mit den Ausführungen, so abhängigkeit und Kopplung zwischen den Klassen zu schaffen, die unter ihnen zusammenarbeiten.

Eine virtuelle Funktion oder Methode ist einfach eine Methode, die Modelle ein öffentliches Verhalten einer Klasse, aber das können wir frei ändern es in der Vererbungskette verlassen, weil sie das Kind Klasse denken könnten müssen einige spezifische Erweiterungen für dieses Verhalten implementieren.

Sie sowohl eine Form von repräsentieren polymorpfhism in der Objektorientierung Paradigma.

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

Wir entwerfen eine gute abstrakte Struktur der Hauptziele unserer Lösung, dann grundlegende Implementierungen schaffen von denen anfälliger für weitere Spezialisierungen und wir machen diese hier als virtuals schließlich spezialisieren wir unsere grundlegende Implementierungen eventyually „Vorrang“ geerbt virtuelle diejenigen Ortung .

Hier schreibe ich einige Beispiel-Code der Hoffnung, dies ein ziemlich konkretes Beispiel kann das Verhalten der Schnittstellen, abstrakte 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 es 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(){
    //
    //    }
    }
}

Zu meinem Verständnis:

Abstrakte Methoden:

Nur die abstrakte Klasse kann abstrakte Methoden halten. Auch die abgeleitete Klasse muss die Methode implementieren und keine Implementierung in der Klasse.

Virtuelle Methoden:

Eine Klasse kann diese erklären und auch die Umsetzung derselben bereitzustellen. Auch die abgeleitete Klasse muß von der Methode implementieren es außer Kraft zu setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top