377 Stimmen

Polymorphismus vs. Overriding vs. Überladen

In Bezug auf Java, wenn jemand fragt:

Was ist Polymorphismus?

Würde Überlastung o Übergeordnetes eine akzeptable Antwort sein?

Ich glaube, da steckt ein bisschen mehr dahinter.

WENN Sie eine abstrakte Basisklasse haben, die eine Methode ohne Implementierung definiert, und Sie definieren diese Methode in der Unterklasse, ist das immer noch überschreibend?

Ich denke Überlastung ist mit Sicherheit nicht die richtige Antwort.

3voto

user1154840 Punkte 91

Ich glaube, ihr vermischt die Begriffe. Polymorphismus ist die Fähigkeit eines Objekts, sich während der Laufzeit unterschiedlich zu verhalten. Um dies zu erreichen, benötigen Sie zwei Voraussetzungen:

  1. Späte Bindung
  2. Vererbung.

Diesbezüglich Überlastung bedeutet etwas anderes für Übergeordnetes je nach der von Ihnen verwendeten Sprache. Zum Beispiel gibt es in Java nicht Übergeordnetes pero Überlastung . Überlastet Methoden mit einer anderen Signatur als die der Basisklasse sind in der Unterklasse verfügbar. Andernfalls wären sie außer Kraft gesetzt (bitte sehen Sie, dass ich jetzt die Tatsache meine, dass es keine Möglichkeit gibt, Ihre Basisklassenmethode von außerhalb des Objekts aufzurufen).

In C++ ist dies jedoch nicht der Fall. Jede überlastet Methode, unabhängig davon, ob die Unterschrift die gleiche ist oder nicht (unterschiedlicher Betrag, unterschiedlicher Typ), ist auch außer Kraft gesetzt . Das heißt, die Methode der Basisklasse ist in der Unterklasse nicht mehr verfügbar, wenn sie von außerhalb des Unterklassenobjekts aufgerufen wird.

Die Antwort lautet also: Wenn Sie über Java sprechen, verwenden Sie Überlastung . In jeder anderen Sprache kann es anders sein, wie es in C++ geschieht

3voto

Genjuro Punkte 6945

Overriding bedeutet, dass eine geerbte Methode versteckt wird, indem eine Methode mit demselben Namen und derselben Signatur wie die übergeordnete Methode (Supermethode) deklariert wird, wodurch der Klasse ein polymorphes Verhalten hinzugefügt wird. Mit anderen Worten, die Entscheidung, welche Methode aufgerufen werden soll, wird zur Laufzeit und nicht zur Kompilierzeit getroffen. Dies führt zu dem Konzept der Schnittstelle und der Implementierung.

2voto

Rajan Punkte 255

Polymorphismus ist wahrscheinlicher, da er Bedeutung betroffen ist ... zu OVERRIDING in Java

Es geht um das unterschiedliche Verhalten desselben Objekts in verschiedenen Situationen (in der Programmierung kann man verschiedene ARGUMENTE nennen)

Ich denke, das folgende Beispiel wird Ihnen helfen, zu verstehen ... Obwohl es nicht PURE Java-Code ist ...

     public void See(Friend)
     {
        System.out.println("Talk");
     }

Aber wenn wir das ARGUMENT ändern ... wird sich das VERHALTEN ändern ...

     public void See(Enemy)
     {
        System.out.println("Run");
     }

Die Person (hier das "Objekt") ist gleich ...

2voto

Desolator Punkte 21470

Polymorphismus ist eine mehrfache Implementierung eines Objekts oder man könnte sagen, mehrere Formen eines Objekts. z.B. die Klasse Animals als abstrakte Basisklasse und sie hat eine Methode namens movement() die die Art und Weise, wie sich das Tier bewegt, bestimmt. In der Realität gibt es verschiedene Arten von Tieren, die sich auch unterschiedlich bewegen, einige mit zwei Beinen, andere mit vier und einige ohne Beine usw.. Zur Definition verschiedener movement() eines jeden Tieres auf der Erde, müssen wir den Polymorphismus anwenden. Sie müssen jedoch mehrere Klassen definieren, z. B. die Klasse Dogs Cats Fish usw. Dann müssen Sie diese Klassen von der Basisklasse aus erweitern Animals und überschreiben Sie dessen Methode movement() mit einer neuen Bewegungsfunktion, die auf jedem Tier basiert, das du hast. Sie können auch verwenden Interfaces um dies zu erreichen. Das Schlüsselwort hier ist overriding, overloading ist anders und wird nicht als Polymorphismus betrachtet. Mit overloading können Sie mehrere Methoden "mit demselben Namen", aber mit unterschiedlichen Parametern für dasselbe Objekt oder dieselbe Klasse definieren.

1voto

bharanitharan Punkte 2389
import java.io.IOException;

class Super {

    protected Super getClassName(Super s) throws IOException {
        System.out.println(this.getClass().getSimpleName() + " - I'm parent");
        return null;
    }

}

class SubOne extends Super {

    @Override
    protected Super getClassName(Super s)  {
        System.out.println(this.getClass().getSimpleName() + " - I'm Perfect Overriding");
        return null;
    }

}

class SubTwo extends Super {

    @Override
    protected Super getClassName(Super s) throws NullPointerException {
        System.out.println(this.getClass().getSimpleName() + " - I'm Overriding and Throwing Runtime Exception");
        return null;
    }

}

class SubThree extends Super {

    @Override
    protected SubThree getClassName(Super s) {
        System.out.println(this.getClass().getSimpleName()+ " - I'm Overriding and Returning SubClass Type");
        return null;
    }

}

class SubFour extends Super {

    @Override
    protected Super getClassName(Super s) throws IOException {
        System.out.println(this.getClass().getSimpleName()+ " - I'm Overriding and Throwing Narrower Exception ");
        return null;
    }

}

class SubFive extends Super {

    @Override
    public Super getClassName(Super s) {
        System.out.println(this.getClass().getSimpleName()+ " - I'm Overriding and have broader Access ");
        return null;
    }

}

class SubSix extends Super {

    public Super getClassName(Super s, String ol) {
        System.out.println(this.getClass().getSimpleName()+ " - I'm Perfect Overloading ");
        return null;
    }

}

class SubSeven extends Super {

    public Super getClassName(SubSeven s) {
        System.out.println(this.getClass().getSimpleName()+ " - I'm Perfect Overloading because Method signature (Argument) changed.");
        return null;
    }

}

public class Test{

    public static void main(String[] args) throws Exception {

        System.out.println("Overriding\n");

        Super s1 = new SubOne(); s1.getClassName(null);

        Super s2 = new SubTwo(); s2.getClassName(null);

        Super s3 = new SubThree(); s3.getClassName(null);

        Super s4 = new SubFour(); s4.getClassName(null);

        Super s5 = new SubFive(); s5.getClassName(null);

        System.out.println("Overloading\n");

        SubSix s6 = new SubSix(); s6.getClassName(null, null);

        s6 = new SubSix(); s6.getClassName(null);

        SubSeven s7 = new SubSeven(); s7.getClassName(s7);

        s7 = new SubSeven(); s7.getClassName(new Super());

    }
}

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