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.

16voto

Alex B Punkte 24270

Sie haben Recht, dass eine Überlastung nicht die Lösung ist.

Beides ist nicht vorrangig. Overriding ist das Mittel, mit dem Sie Polymorphismus erhalten. Polymorphismus ist die Fähigkeit eines Objekts, sein Verhalten je nach Typ zu ändern. Dies wird am besten demonstriert, wenn der Aufrufer eines Objekts, das Polymorphismus aufweist, nicht weiß, welchen Typ das Objekt hat.

12voto

Peter Meyer Punkte 25181

Der Begriff "Overloading" oder "Overriding" gibt nicht das ganze Bild wieder. Polymorphismus ist einfach die Fähigkeit eines Objekts, sein Verhalten auf der Grundlage seines Typs zu spezialisieren.

Ich würde einigen der hier gegebenen Antworten insofern widersprechen, als das Überladen eine Form des Polymorphismus (parametrischer Polymorphismus) ist, wenn eine Methode mit demselben Namen sich bei verschiedenen Parametertypen unterschiedlich verhalten kann. Ein gutes Beispiel ist das Überladen von Operatoren. Sie können "+" so definieren, dass es verschiedene Typen von Parametern akzeptiert - sagen wir Strings oder Ints - und je nach diesen Typen verhält sich "+" anders.

Zur Polymorphie gehören auch die Vererbung und das Überschreiben von Methoden, wobei diese im Basistyp abstrakt oder virtuell sein können. Was den vererbungsbasierten Polymorphismus betrifft, so unterstützt Java nur die Vererbung einer einzigen Klasse und beschränkt sein polymorphes Verhalten auf eine einzige Kette von Basistypen. Java unterstützt die Implementierung mehrerer Schnittstellen, was eine weitere Form des polymorphen Verhaltens darstellt.

8voto

Developer Punkte 514

Obwohl, Polymorphismus ist bereits in großen Details in diesem Beitrag erklärt, aber ich möchte mehr Gewicht auf, warum Teil davon zu setzen.

Warum Polymorphismus in jeder OOP-Sprache so wichtig ist.

Lassen Sie uns versuchen, eine einfache Anwendung für einen Fernseher mit und ohne Vererbung/Polymorphismus zu erstellen. Nach jeder Version der Anwendung machen wir eine kleine Retrospektive.

Angenommen, Sie sind Software-Ingenieur bei einem Fernsehunternehmen und sollen eine Software für Lautstärke-, Helligkeits- und Farbregler schreiben, um deren Werte auf Benutzerbefehl zu erhöhen oder zu verringern.

Sie beginnen mit dem Schreiben von Klassen für jedes dieser Merkmale, indem Sie

  1. set:- Um einen Wert eines Controllers zu setzen (vorausgesetzt, dieser hat einen controller-spezifischen Code)
  2. get:- Um einen Wert eines Controllers zu erhalten (vorausgesetzt, dieser hat controller-spezifischen Code)
  3. anpassen:- Validierung der Eingabe und Einstellung eines Controllers (allgemeine Validierungen, unabhängig von Controllern)
  4. Zuordnung von Benutzereingaben mit Controllern: - Abrufen von Benutzereingaben und entsprechender Aufruf von Controllern.

Anwendung Version 1

import java.util.Scanner;    
class VolumeControllerV1 {
    private int value;
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of VolumeController \t"+this.value);
        this.value = value;
        System.out.println("New value of VolumeController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}
class  BrightnessControllerV1 {
    private int value;
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of BrightnessController \t"+this.value);
        this.value = value;
        System.out.println("New value of BrightnessController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}
class ColourControllerV1    {
    private int value;
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of ColourController \t"+this.value);
        this.value = value;
        System.out.println("New value of ColourController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}

/*
 *       There can be n number of controllers
 * */
public class TvApplicationV1 {
    public static void main(String[] args)  {
        VolumeControllerV1 volumeControllerV1 = new VolumeControllerV1();
        BrightnessControllerV1 brightnessControllerV1 = new BrightnessControllerV1();
        ColourControllerV1 colourControllerV1 = new ColourControllerV1();

        OUTER: while(true) {
            Scanner sc=new Scanner(System.in);
            System.out.println(" Enter your option \n Press 1 to increase volume \n Press 2 to decrease volume");
            System.out.println(" Press 3 to increase brightness \n Press 4 to decrease brightness");
            System.out.println(" Press 5 to increase color \n Press 6 to decrease color");
            System.out.println("Press any other Button to shutdown");
            int button = sc.nextInt();
            switch (button) {
                case  1:    {
                    volumeControllerV1.adjust(5);
                    break;
                }
                case 2: {
                    volumeControllerV1.adjust(-5);
                    break;
                }
                case  3:    {
                    brightnessControllerV1.adjust(5);
                    break;
                }
                case 4: {
                    brightnessControllerV1.adjust(-5);
                    break;
                }
                case  5:    {
                    colourControllerV1.adjust(5);
                    break;
                }
                case 6: {
                colourControllerV1.adjust(-5);
                break;
            }
            default:
                System.out.println("Shutting down...........");
                break OUTER;
        }

    }
    }
}

Jetzt haben Sie unsere erste Version einer funktionierenden Anwendung, die bereit ist, eingesetzt zu werden. Es ist an der Zeit, die bisher geleistete Arbeit zu analysieren.

Probleme mit der TV-Anwendung Version 1

  1. Der Code Adjust(int value) ist in allen drei Klassen doppelt vorhanden. Sie möchten die Duplizität des Codes minimieren. (Aber Sie haben nicht an gemeinsamen Code gedacht und ihn in eine Superklasse verschoben, um doppelten Code zu vermeiden)

Sie können damit leben, solange Ihre Anwendung wie erwartet funktioniert.

Manchmal kommt Ihr Chef zu Ihnen zurück und bittet Sie, die bestehende Anwendung um eine Rücksetzfunktion zu erweitern. Das Zurücksetzen würde alle drei Regler auf ihre jeweiligen Standardwerte zurücksetzen.

Sie beginnen mit dem Schreiben einer neuen Klasse (ResetFunctionV2) für die neue Funktionalität und bilden den Benutzereingabe-Zuordnungscode für diese neue Funktion ab.

Anwendung Version 2

import java.util.Scanner;
class VolumeControllerV2    {

    private int defaultValue = 25;
    private int value;

    int getDefaultValue() {
        return defaultValue;
    }
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of VolumeController \t"+this.value);
        this.value = value;
        System.out.println("New value of VolumeController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}
class  BrightnessControllerV2   {

    private int defaultValue = 50;
    private int value;
    int get()    {
        return value;
    }
    int getDefaultValue() {
        return defaultValue;
    }
    void set(int value) {
        System.out.println("Old value of BrightnessController \t"+this.value);
        this.value = value;
        System.out.println("New value of BrightnessController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}
class ColourControllerV2    {

    private int defaultValue = 40;
    private int value;
    int get()    {
        return value;
    }
    int getDefaultValue() {
        return defaultValue;
    }
    void set(int value) {
        System.out.println("Old value of ColourController \t"+this.value);
        this.value = value;
        System.out.println("New value of ColourController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}

class ResetFunctionV2 {

    private VolumeControllerV2 volumeControllerV2 ;
    private BrightnessControllerV2 brightnessControllerV2;
    private ColourControllerV2 colourControllerV2;

    ResetFunctionV2(VolumeControllerV2 volumeControllerV2, BrightnessControllerV2 brightnessControllerV2, ColourControllerV2 colourControllerV2)  {
        this.volumeControllerV2 = volumeControllerV2;
        this.brightnessControllerV2 = brightnessControllerV2;
        this.colourControllerV2 = colourControllerV2;
    }
    void onReset()    {
        volumeControllerV2.set(volumeControllerV2.getDefaultValue());
        brightnessControllerV2.set(brightnessControllerV2.getDefaultValue());
        colourControllerV2.set(colourControllerV2.getDefaultValue());
    }
}
/*
 *       so on
 *       There can be n number of controllers
 *
 * */
public class TvApplicationV2 {
    public static void main(String[] args)  {
        VolumeControllerV2 volumeControllerV2 = new VolumeControllerV2();
        BrightnessControllerV2 brightnessControllerV2 = new BrightnessControllerV2();
        ColourControllerV2 colourControllerV2 = new ColourControllerV2();

        ResetFunctionV2 resetFunctionV2 = new ResetFunctionV2(volumeControllerV2, brightnessControllerV2, colourControllerV2);

        OUTER: while(true) {
            Scanner sc=new Scanner(System.in);
            System.out.println(" Enter your option \n Press 1 to increase volume \n Press 2 to decrease volume");
            System.out.println(" Press 3 to increase brightness \n Press 4 to decrease brightness");
            System.out.println(" Press 5 to increase color \n Press 6 to decrease color");
            System.out.println(" Press 7 to reset TV \n Press any other Button to shutdown");
            int button = sc.nextInt();
            switch (button) {
                case  1:    {
                    volumeControllerV2.adjust(5);
                    break;
                }
                case 2: {
                    volumeControllerV2.adjust(-5);
                    break;
                }
                case  3:    {
                    brightnessControllerV2.adjust(5);
                    break;
                }
                case 4: {
                    brightnessControllerV2.adjust(-5);
                    break;
                }
                case  5:    {
                    colourControllerV2.adjust(5);
                    break;
                }
                case 6: {
                    colourControllerV2.adjust(-5);
                    break;
                }
                case 7: {
                    resetFunctionV2.onReset();
                    break;
                }
                default:
                    System.out.println("Shutting down...........");
                    break OUTER;
            }

        }
    }
}

Sie haben also Ihre Anwendung mit der Funktion Zurücksetzen vorbereitet. Aber jetzt wird Ihnen klar, dass

Probleme mit der TV-Anwendung Version 2

  1. Wenn ein neues Steuergerät in das Produkt eingeführt wird, müssen Sie den Code für die Rücksetzfunktion ändern.
  2. Wenn die Anzahl der Controller sehr hoch wird, haben Sie Probleme, die Referenzen der Controller zu halten.
  3. Der Code der Rücksetzfunktion ist eng mit dem Code aller Controllerklassen gekoppelt (um Standardwerte zu erhalten und zu setzen).
  4. Die Funktionsklasse Reset (ResetFunctionV2) kann auf andere Methoden der Klasse Controller (adjust) zugreifen, was unerwünscht ist.

Gleichzeitig hören Sie von Ihrem Chef, dass Sie möglicherweise eine Funktion hinzufügen müssen, bei der jedes Steuergerät beim Start über das Internet nach der neuesten Version des Treibers aus dem vom Unternehmen gehosteten Treiber-Repository suchen muss.

Jetzt fangen Sie an zu denken, dass diese neue Funktion, die hinzugefügt werden soll, der Reset-Funktion ähnelt, und die Probleme der Anwendung (V2) werden sich vervielfachen, wenn Sie Ihre Anwendung nicht umstrukturieren.

Sie denken darüber nach, Vererbung zu verwenden, um die polymorphen Fähigkeiten von JAVA zu nutzen und fügen eine neue abstrakte Klasse (ControllerV3) zu

  1. Deklarieren Sie die Signatur der Get- und Set-Methode.
  2. Enthält die Implementierung der Anpassungsmethode, die zuvor auf alle Steuerungen repliziert wurde.
  3. Deklarieren Sie die setDefault-Methode, so dass die Rücksetzungsfunktion leicht unter Ausnutzung der Polymorphie implementiert werden kann.

Mit diesen Verbesserungen steht Ihnen die Version 3 Ihrer TV-Anwendung zur Verfügung.

Anwendung Version 3

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

abstract class ControllerV3 {
    abstract void set(int value);
    abstract int get();
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
    abstract void setDefault();
}
class VolumeControllerV3 extends ControllerV3   {

    private int defaultValue = 25;
    private int value;

    public void setDefault() {
        set(defaultValue);
    }
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of VolumeController \t"+this.value);
        this.value = value;
        System.out.println("New value of VolumeController \t"+this.value);
    }
}
class  BrightnessControllerV3  extends ControllerV3   {

    private int defaultValue = 50;
    private int value;

    public void setDefault() {
        set(defaultValue);
    }
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of BrightnessController \t"+this.value);
        this.value = value;
        System.out.println("New value of BrightnessController \t"+this.value);
    }
}
class ColourControllerV3 extends ControllerV3   {

    private int defaultValue = 40;
    private int value;

    public void setDefault() {
        set(defaultValue);
    }
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of ColourController \t"+this.value);
        this.value = value;
        System.out.println("New value of ColourController \t"+this.value);
    }
}

class ResetFunctionV3 {

    private List<ControllerV3> controllers = null;

    ResetFunctionV3(List<ControllerV3> controllers)  {
        this.controllers = controllers;
    }
    void onReset()    {
        for (ControllerV3 controllerV3 :this.controllers)  {
            controllerV3.setDefault();
        }
    }
}
/*
 *       so on
 *       There can be n number of controllers
 *
 * */
public class TvApplicationV3 {
    public static void main(String[] args)  {
        VolumeControllerV3 volumeControllerV3 = new VolumeControllerV3();
        BrightnessControllerV3 brightnessControllerV3 = new BrightnessControllerV3();
        ColourControllerV3 colourControllerV3 = new ColourControllerV3();

        List<ControllerV3> controllerV3s = new ArrayList<>();
        controllerV3s.add(volumeControllerV3);
        controllerV3s.add(brightnessControllerV3);
        controllerV3s.add(colourControllerV3);

        ResetFunctionV3 resetFunctionV3 = new ResetFunctionV3(controllerV3s);

        OUTER: while(true) {
            Scanner sc=new Scanner(System.in);
            System.out.println(" Enter your option \n Press 1 to increase volume \n Press 2 to decrease volume");
            System.out.println(" Press 3 to increase brightness \n Press 4 to decrease brightness");
            System.out.println(" Press 5 to increase color \n Press 6 to decrease color");
            System.out.println(" Press 7 to reset TV \n Press any other Button to shutdown");
            int button = sc.nextInt();
            switch (button) {
                case  1:    {
                    volumeControllerV3.adjust(5);
                    break;
                }
                case 2: {
                    volumeControllerV3.adjust(-5);
                    break;
                }
                case  3:    {
                    brightnessControllerV3.adjust(5);
                    break;
                }
                case 4: {
                    brightnessControllerV3.adjust(-5);
                    break;
                }
                case  5:    {
                    colourControllerV3.adjust(5);
                    break;
                }
                case 6: {
                    colourControllerV3.adjust(-5);
                    break;
                }
                case 7: {
                    resetFunctionV3.onReset();
                    break;
                }
                default:
                    System.out.println("Shutting down...........");
                    break OUTER;
            }

        }
    }
}

Obwohl die meisten der in der Liste der Probleme von V2 aufgeführten Probleme behandelt wurden, mit Ausnahme von

Probleme mit der TV-Anwendung Version 3

  1. Die Reset-Funktionsklasse (ResetFunctionV3) kann auf andere Methoden der Controller-Klasse (adjust) zugreifen, was unerwünscht ist.

Auch hier denken Sie daran, dieses Problem zu lösen, da Sie nun eine weitere Funktion (Treiberaktualisierung beim Start) implementieren müssen. Wenn Sie das Problem nicht beheben, wird es sich auch auf neue Funktionen übertragen.

Sie teilen also den in der abstrakten Klasse definierten Vertrag und schreiben 2 Schnittstellen für

  1. Reset-Funktion.
  2. Treiber-Update.

Und lassen Sie Ihre 1. konkrete Klasse diese wie folgt implementieren

Anwendung Version 4

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

interface OnReset {
    void setDefault();
}
interface OnStart {
    void checkForDriverUpdate();
}
abstract class ControllerV4 implements OnReset,OnStart {
    abstract void set(int value);
    abstract int get();
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}

class VolumeControllerV4 extends ControllerV4 {

    private int defaultValue = 25;
    private int value;
    @Override
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of VolumeController \t"+this.value);
        this.value = value;
        System.out.println("New value of VolumeController \t"+this.value);
    }
    @Override
    public void setDefault() {
        set(defaultValue);
    }

    @Override
    public void checkForDriverUpdate()    {
        System.out.println("Checking driver update for VolumeController .... Done");
    }
}
class  BrightnessControllerV4 extends ControllerV4 {

    private int defaultValue = 50;
    private int value;
    @Override
    int get()    {
        return value;
    }
    @Override
    void set(int value) {
        System.out.println("Old value of BrightnessController \t"+this.value);
        this.value = value;
        System.out.println("New value of BrightnessController \t"+this.value);
    }

    @Override
    public void setDefault() {
        set(defaultValue);
    }

    @Override
    public void checkForDriverUpdate()    {
        System.out.println("Checking driver update for BrightnessController .... Done");
    }
}
class ColourControllerV4 extends ControllerV4 {

    private int defaultValue = 40;
    private int value;
    @Override
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of ColourController \t"+this.value);
        this.value = value;
        System.out.println("New value of ColourController \t"+this.value);
    }
    @Override
    public void setDefault() {
        set(defaultValue);
    }

    @Override
    public void checkForDriverUpdate()    {
        System.out.println("Checking driver update for ColourController .... Done");
    }
}
class ResetFunctionV4 {

    private List<OnReset> controllers = null;

    ResetFunctionV4(List<OnReset> controllers)  {
        this.controllers = controllers;
    }
    void onReset()    {
        for (OnReset onreset :this.controllers)  {
            onreset.setDefault();
        }
    }
}
class InitializeDeviceV4 {

    private List<OnStart> controllers = null;

    InitializeDeviceV4(List<OnStart> controllers)  {
        this.controllers = controllers;
    }
    void initialize()    {
        for (OnStart onStart :this.controllers)  {
            onStart.checkForDriverUpdate();
        }
    }
}
/*
*       so on
*       There can be n number of controllers
*
* */
public class TvApplicationV4 {
    public static void main(String[] args)  {
        VolumeControllerV4 volumeControllerV4 = new VolumeControllerV4();
        BrightnessControllerV4 brightnessControllerV4 = new BrightnessControllerV4();
        ColourControllerV4 colourControllerV4 = new ColourControllerV4();
        List<ControllerV4> controllerV4s = new ArrayList<>();
        controllerV4s.add(brightnessControllerV4);
        controllerV4s.add(volumeControllerV4);
        controllerV4s.add(colourControllerV4);

        List<OnStart> controllersToInitialize = new ArrayList<>();
        controllersToInitialize.addAll(controllerV4s);
        InitializeDeviceV4 initializeDeviceV4 = new InitializeDeviceV4(controllersToInitialize);
        initializeDeviceV4.initialize();

        List<OnReset> controllersToReset = new ArrayList<>();
        controllersToReset.addAll(controllerV4s);
        ResetFunctionV4 resetFunctionV4 = new ResetFunctionV4(controllersToReset);

        OUTER: while(true) {
            Scanner sc=new Scanner(System.in);
            System.out.println(" Enter your option \n Press 1 to increase volume \n Press 2 to decrease volume");
            System.out.println(" Press 3 to increase brightness \n Press 4 to decrease brightness");
            System.out.println(" Press 5 to increase color \n Press 6 to decrease color");
            System.out.println(" Press 7 to reset TV \n Press any other Button to shutdown");
            int button = sc.nextInt();
            switch (button) {
                case  1:    {
                    volumeControllerV4.adjust(5);
                    break;
                }
                case 2: {
                    volumeControllerV4.adjust(-5);
                    break;
                }
                case  3:    {
                    brightnessControllerV4.adjust(5);
                    break;
                }
                case 4: {
                    brightnessControllerV4.adjust(-5);
                    break;
                }
                case  5:    {
                    colourControllerV4.adjust(5);
                    break;
                }
                case 6: {
                    colourControllerV4.adjust(-5);
                    break;
                }
                case 7: {
                    resetFunctionV4.onReset();
                    break;
                }
                default:
                    System.out.println("Shutting down...........");
                    break OUTER;
            }

        }
    }
}

Nun wurden alle Probleme, mit denen Sie konfrontiert waren, angesprochen und Sie erkannten, dass Sie mit Hilfe von Vererbung und Polymorphismus

  1. Halten Sie verschiedene Teile der Anwendung lose gekoppelt (Reset- oder Treiber-Update-Funktionskomponenten müssen nicht auf die tatsächlichen Controller-Klassen (Lautstärke, Helligkeit und Farbe) aufmerksam gemacht werden, jede Klasse, die OnReset oder OnStart implementiert, wird für Reset- bzw. Treiber-Update-Funktionskomponenten akzeptiert).
  2. Anwendungserweiterung wird einfacher (neu hinzugefügte Controller haben keinen Einfluss auf die Reset- oder Treiber-Update-Komponente, und es ist jetzt sehr einfach für Sie, neue hinzuzufügen)
  3. Beibehaltung der Abstraktionsebene (jetzt kann die Reset-Funktion nur die setDefault-Methode von Controllern sehen und die Reset-Funktion kann nur die checkForDriverUpdate-Methode von Controllern sehen)

Ich hoffe, das hilft :-)

7voto

Brian G Punkte 51183

Das klassische Beispiel: Hunde und Katzen sind Tiere, Tiere haben die Methode makeNoise. Ich kann durch ein Array von Tieren iterieren, indem ich makeNoise aufrufe und erwarte, dass sie ihre jeweilige Implementierung ausführen.

Der anrufende Code muss nicht wissen, um welches Tier es sich handelt.

Das ist es, was ich unter Polymorphismus verstehe.

7voto

BillC Punkte 71

Polymorphismus bedeutet einfach "viele Formen".

Sie ERFORDERT keine Vererbung... da die Schnittstellenimplementierung, die überhaupt keine Vererbung ist, polymorphen Bedürfnissen dient. Man kann argumentieren, dass die Schnittstellenimplementierung polymorphe Anforderungen "besser" erfüllt als die Vererbung.

Würden Sie zum Beispiel eine Superklasse erstellen, die alle Dinge beschreibt, die fliegen können? Ich denke nicht. Am besten wäre es, eine Schnittstelle zu erstellen, die das Fliegen beschreibt, und es dabei zu belassen.

Da also Schnittstellen das Verhalten beschreiben und Methodennamen das Verhalten (für den Programmierer), ist es nicht zu weit hergeholt, das Überladen von Methoden als eine geringere Form des Polymorphismus zu betrachten.

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