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.

949voto

Chris Cudmore Punkte 28967

Am deutlichsten lässt sich Polymorphismus durch eine abstrakte Basisklasse (oder Schnittstelle) ausdrücken

public abstract class Human{
   ...
   public abstract void goPee();
}

Diese Klasse ist abstrakt, weil die goPee() Methode ist für Menschen nicht definierbar. Sie ist nur für die Unterklassen Male und Female definierbar. Außerdem ist Human ein abstraktes Konzept - Sie können keinen Menschen erstellen, der weder männlich noch weiblich ist. Er muss entweder das eine oder das andere sein.

Wir verschieben also die Implementierung, indem wir die abstrakte Klasse verwenden.

public class Male extends Human{
...
    @Override
    public void goPee(){
        System.out.println("Stand Up");
    }
}

y

public class Female extends Human{
...
    @Override
    public void goPee(){
        System.out.println("Sit Down");
    }
}

Jetzt können wir einem ganzen Raum voller Menschen sagen, dass sie pinkeln gehen sollen.

public static void main(String[] args){
    ArrayList<Human> group = new ArrayList<Human>();
    group.add(new Male());
    group.add(new Female());
    // ... add more...

    // tell the class to take a pee break
    for (Human person : group) person.goPee();
}

Die Ausführung würde Folgendes ergeben:

Stand Up
Sit Down
...

105voto

The Digital Gabeg Punkte 2725

Polymorphismus ist die Fähigkeit einer Klasseninstanz, sich so zu verhalten, als wäre sie eine Instanz einer anderen Klasse in ihrem Vererbungsbaum, meist einer ihrer Vorgängerklassen. In Java zum Beispiel erben alle Klassen von Object. Daher können Sie eine Variable vom Typ Object erstellen und ihr eine Instanz einer beliebigen Klasse zuweisen.

Eine Überschreiben Sie ist eine Art von Funktion, die in einer Klasse vorkommt, die von einer anderen Klasse erbt. Eine Überschreibungsfunktion "ersetzt" eine von der Basisklasse geerbte Funktion, aber so, dass sie auch dann aufgerufen wird, wenn eine Instanz ihrer Klasse durch Polymorphie einen anderen Typ vorgibt zu sein. Bezogen auf das vorherige Beispiel könnten Sie Ihre eigene Klasse definieren und die Funktion toString() überschreiben. Da diese Funktion von Object geerbt wird, ist sie auch dann verfügbar, wenn Sie eine Instanz dieser Klasse in eine Variable vom Typ Object kopieren. Wenn Sie toString() in Ihrer Klasse aufrufen, während diese vorgibt, ein Object zu sein, wird normalerweise die Version von toString ausgelöst, die in Object selbst definiert ist. Da es sich bei der Funktion jedoch um eine Überschreibung handelt, wird die Definition von toString() aus Ihrer Klasse auch dann verwendet, wenn der wahre Typ der Klasseninstanz hinter Polymorphismus verborgen ist.

Überlastung ist die Definition mehrerer Methoden mit demselben Namen, aber mit unterschiedlichen Parametern. Sie hat nichts mit Overriding oder Polymorphismus zu tun.

65voto

manoj Punkte 587

Polymorphismus bedeutet, dass ein und dasselbe Objekt je nach Anforderung unterschiedliche Operationen durchführt.

Polymorphismus kann auf zwei Arten erreicht werden, nämlich

  1. Überschreibung von Methoden
  2. Überladen von Methoden

Überladen von Methoden bedeutet, dass zwei oder mehr Methoden in derselben Klasse geschrieben werden, indem derselbe Methodenname verwendet wird, aber die Übergabeparameter unterschiedlich sind.

Überschreibung von Methoden bedeutet, dass wir die Methodennamen in den verschiedenen Klassen verwenden, d.h. die Methode der Elternklasse wird in der Kindklasse verwendet.

Um Polymorphie zu erreichen, kann in Java eine Referenzvariable der Oberklasse das Objekt der Unterklasse enthalten.

Um die Polymorphie zu erreichen, muss jeder Entwickler die gleichen Methodennamen im Projekt verwenden.

46voto

Patrick McElhaney Punkte 55251

Sowohl Overriding als auch Overloading werden verwendet, um Polymorphismus zu erreichen.

Sie könnten eine Metho die außer Kraft gesetzt i mehreren Unterklassen. Die Methode macht unterschiedliche Dinge, je nachdem, welche Klasse ein Objekt instanziiert wurde.

    abstract class Beverage {
       boolean isAcceptableTemperature();
    }

    class Coffee extends Beverage {
       boolean isAcceptableTemperature() { 
           return temperature > 70;
       }
    }

    class Wine extends Beverage {
       boolean isAcceptableTemperature() { 
           return temperature < 10;
       }
    }

Sie könnten auch eine Ich überlastet mit zwei oder mehr Gruppen von Argumenten. T verschiedene Dinge auf der Grundlage der Art(en) des/der übergebenen Argumente(s).

    class Server {
        public void pour (Coffee liquid) {
            new Cup().fillToTopWith(liquid);
        }

        public void pour (Wine liquid) {
            new WineGlass().fillHalfwayWith(liquid);
        }

        public void pour (Lemonade liquid, boolean ice) {
            Glass glass = new Glass();
            if (ice) {
                glass.fillToTopWith(new Ice());
            }
            glass.fillToTopWith(liquid);
        }
    }

42voto

Mark A. Nicolosi Punkte 77085

Hier ist ein Beispiel für Polymorphismus in Pseudo-C#/Java:

class Animal
{
    abstract string MakeNoise ();
}

class Cat : Animal {
    string MakeNoise () {
        return "Meow";
    }
}

class Dog : Animal {
    string MakeNoise () {
        return "Bark";
    }
}

Main () {
   Animal animal = Zoo.GetAnimal ();
   Console.WriteLine (animal.MakeNoise ());
}

Die Funktion Main kennt den Typ des Tieres nicht und hängt vom Verhalten einer bestimmten Implementierung der Methode MakeNoise() ab.

Edit: Sieht aus, als wäre Brian mir zuvorgekommen. Lustig, dass wir das gleiche Beispiel verwendet haben. Aber der obige Code sollte helfen, die Konzepte zu klären.

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