Frage

In Bezug auf Java, wenn jemand fragt:

was ist Polymorphismus?

Würde überlastung oder überschreiben eine akzeptable Antwort?

Ich denke, es ist ein bisschen mehr als das.

WENN Sie eine abstrakte Basisklasse definiert eine Methode ohne Implementierung, und Sie definiert, dass die Methode in der Unterklasse ist, dass noch overridding?

Ich denke, überlastung ist nicht die richtige Antwort für Sie sicher.

War es hilfreich?

Lösung

Der klarste Weg Polymorphismus auszudrücken, ist über eine abstrakte Basisklasse (oder Schnittstelle)

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

Diese Klasse ist abstrakt, weil die goPee() Methode nicht definierbar für die Menschen ist. Es ist nur definierbar für die Unterklassen männlich und weiblich. Auch Mensch ist ein abstraktes Konzept - Sie können nicht einen Menschen schaffen, die weder männlich noch weiblich ist. Es hat eine oder das andere sein.

So wir verschieben die Umsetzung durch die abstrakte Klasse.

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

und

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

Jetzt können wir einen ganzen Raum voller Menschen sagen, pinkeln zu gehen.

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

des Lauf ergeben würde:

Stand Up
Sit Down
...

Andere Tipps

Polymorphismus ist die Fähigkeit einer Klasseninstanz zu verhalten, als ob es sich um eine Instanz einer anderen Klasse in seiner Vererbungsbaum waren, am häufigsten einer seiner Vorfahren Klassen. Zum Beispiel in Java erben alle Klassen von Object. Daher können Sie eine Variable vom Typ Object erstellen und er eine Instanz einer Klasse zugeordnet werden.

Ein Überschreiben ist eine Art von Funktion, die in einer Klasse auftritt, die von einer anderen Klasse erbt. Eine Überbrückungsfunktion „ersetzt“ eine Funktion aus der Basisklasse geerbt, tut dies aber so, dass es auch genannt wird, wenn eine Instanz der Klasse vorgibt eine andere Art durch Polymorphismus zu sein. Mit Bezug auf das vorherige Beispiel könnten Sie Ihre eigene Klasse definieren und die toString () Funktion außer Kraft setzen. Da diese Funktion von Objekt geerbt wird, wird es immer noch verfügbar, wenn Sie eine Instanz dieser Klasse in einen Objekt-Typ Variable kopieren. Normalerweise, wenn Sie toString () auf Ihrer Klasse aufrufen, während er vorgibt, ein Objekt zu sein, die Version von toString, die tatsächlich Feuer das auf Objekt selbst definiert ist. Da jedoch die Funktion eine Überschreibung ist, wird die Definition von toString () aus der Klasse verwendet, auch wenn die Truetype-Klasse-Instanz hinter Polymorphismus versteckt.

Overloading ist die Aktion von mehreren Methoden mit dem gleichen Namen definiert, aber mit unterschiedlichen Parametern. Es ist in keinem Zusammenhang mit entweder überwiegenden oder Polymorphismus.

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 Hauptfunktion kennt nicht die Art des Tieres und ist abhängig von Verhalten einer bestimmten Implementierung des MakeNoise () -Methode.

Edit: Sieht aus wie Brian mich auf den Stempel zu schlagen. Lustige wir haben das gleiche Beispiel. Aber der obige Code sollte die Konzepte helfen zu klären.

Polymorphismus bedeutet mehr als eine Form, gleiche Objekt verschiedene Operationen entsprechend der Anforderung durchgeführt wird.

Polymorphismus kann durch Verwendung von zwei Arten erreicht werden, das ist

  1. Methode übergeordnete
  2. Methode Überlastung

Method Überlastung bedeutet, dass zwei oder mehr Verfahren in der gleichen Klasse zu schreiben, indem dasselbe Verfahren unter Verwendung von Namen, aber die Übergabe von Parametern verschieden ist.

Methode überschreibt bedeutet, dass wir die Methodennamen in den verschiedenen Klassen verwenden, die übergeordneten Klasse Methode bedeutet, in der Kind-Klasse verwendet.

In Java erreichen Polymorphismus eine Superklassenreferenzvariable, die das Unterklasse-Objekt enthalten kann.

Um den Polymorphismus zu erreichen jeder Entwickler die gleichen Methodennamen im Projekt verwenden müssen.

Beide überwiegendes und Überlastung werden verwendet, Polymorphismus zu erreichen.

Sie können eine Methode in einer Klasse     dh außer Kraft gesetzt in einer oder     mehr untereinander. Das Verfahren funktioniert     verschiedene Dinge je nachdem, welche     Klasse wurde verwendet, um ein Objekt zu instanziieren.

    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önnen auch eine Methode, die ist      überlastet mit zwei oder mehr Sätze von Argumenten. Das Verfahren funktioniert     verschiedene Dinge auf der Basis     Art (en) des Arguments (en) übergeben.

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

Sie sind richtig, dass eine Überlastung ist nicht die Antwort.

Weder wird überschrieben. Übergeordnete ist das Mittel, mit dem Sie Polymorphismus erhalten. Polymorphismus ist die Möglichkeit für ein Objekt Verhalten zu verändern, basierend auf ihrem Typ. Dies wird am besten demonstriert, wenn der Anrufer eines Objekts, das Polymorphismus zeigt, ist nicht bewusst, was bestimmte Art des Objekt ist.

Im Einzelnen sagen, Überlastung oder überwiegendes nicht das ganze Bild geben. Polymorphismus ist einfach die Fähigkeit eines Objekts sein Verhalten auf seine Art auf Basis spezialisiert.

würde ich mit einigen der Antworten hier in dieser Überlastung nicht einverstanden ist eine Form des Polymorphismus (parametrischen Polymorphismus) in dem Fall, dass ein Verfahren mit dem gleichen Namen kann unterschiedlich verschiedene Parametertypen geben verhalten. Ein gutes Beispiel ist Betreiber Überlastung. Sie können „+“ akzeptieren verschiedene Arten von Parametern definieren - sagen Strings oder int ist -. Und auf der Grundlage dieser Typen, „+“ wird sich anders verhalten

Polymorphismus enthält auch Vererbung und übergeordnete Methoden, obwohl sie abstrakt oder virtuell in dem Basistyp sein können. In Bezug auf die Vererbung basierten Polymorphismus, unterstützt nur Java einfache Vererbung Klasse es polymorphe Verhalten derjenigen einer einzigen Kette von Basistypen zu begrenzen. Java unterstützt jedoch Implementierung mehrerer Schnittstellen, die noch eine andere Form von polymorphen Verhalten ist.

Polymorphismus bedeutet einfach "Viele Forms".

Es ist nicht Erbe REQUIRE ... als Interface-Implementierung zu erreichen, die überhaupt nicht Erbe ist, dienen polymorphe Bedürfnissen. Argumentieren, dient Interface-Implementierung polymorphe Bedürfnissen „besser“ als Vererbung.

Zum Beispiel würden Sie eine Super-Klasse erstellen, um alle Dinge zu beschreiben, die fliegen können? Ich sollte denken nicht. Sie würden am besten gedient werden werden, um eine Schnittstelle zu schaffen, den Flug beschreibt und es dabei belassen.

So

, da Schnittstellen Verhalten beschreibt und Methodennamen Verhalten beschreiben (für den Programmierer), ist es nicht allzu weit hergeholt Methode Überlastung als mildere Form von Polymorphismus zu berücksichtigen.

Das klassische Beispiel, Hunde und Katzen sind Tiere, Tiere haben die Methode makeNoise. Ich kann durch eine Reihe von Tieren durchlaufen sie auffordern makeNoise und erwarten, dass sie dort entsprechende Umsetzung tun würde.

Der Aufruf Code nicht wissen, was bestimmte Tier sie sind.

Das ist, was ich mir vorstellen, wie Polymorphismus.

Polymorphismus ist die Fähigkeit für ein Objekt in mehreren Formen zu erscheinen. Dies beinhaltet Vererbung und virtuelle Funktionen mit einer Familie von Objekten zu bauen, die ausgetauscht werden können. Die Basisklasse enthält die Prototypen der virtuellen Funktionen, die möglicherweise nicht implementiert oder mit Standardimplementierungen wie die Anwendung diktiert, und die verschiedenen abgeleiteten Klassen jeweils implementiert sie anders unterschiedliche Verhaltensweisen zu beeinflussen.

Weder:

Overloading ist, wenn Sie die gleiche Funktion Namen haben, die unterschiedliche Parameter verwendet.

Übergeordnete ist, wenn ein Kind Klasse ein Eltern Verfahren mit einem seiner eigenen ersetzt (das in iteself stellt keine Polymorphismus).

Polymorphismus ist die späte Bindung, z.B. die Basisklasse (übergeordneten) Methoden aufgerufen werden aber erst zur Laufzeit weiß die Anwendung, was die eigentliche Aufgabe ist - es ist ein Kind Klasse, deren Methoden sein kann unterschiedlich sind. Dies liegt daran, dass jedes Kind-Klasse verwendet werden kann, wo eine Basisklasse definiert ist.

In Java Sie Polymorphismus sehen eine Menge mit den Sammlungen Bibliothek:

int countStuff(List stuff) {
  return stuff.size();
}

Liste ist die Basisklasse, hat der Compiler keine Ahnung, wenn Sie eine verknüpfte Liste, Vektor, Array sind zählen, oder eine benutzerdefinierte Liste Implementierung, solange es wie eine Liste handelt:

List myStuff = new MyTotallyAwesomeList();
int result = countStuff(myStuff);

Wenn Sie wurden überlasten würden Sie haben:

int countStuff(LinkedList stuff) {...}
int countStuff(ArrayList stuff) {...}
int countStuff(MyTotallyAwesomeList stuff) {...}
etc...

und die richtige Version von countStuff () würde durch den Compiler aufgenommen werden, um die Parameter zu entsprechen.

Der Begriff Überlastung bezieht sich mehrere Versionen von etwas mit dem gleichen Namen zu haben, in der Regel Methoden mit unterschiedlichen Parameterlisten

public int DoSomething(int objectId) { ... }
public int DoSomething(string objectName) { ... }

So sind diese Funktionen könnten das Gleiche tun, aber Sie haben die Möglichkeit, es mit einer ID zu nennen, oder einen Namen. Hat nichts mit Vererbung, abstrakten Klassen zu tun, etc.

Aufschalten in der Regel bezieht sich auf Polymorphismus, wie Sie in Ihrer Frage beschrieben

Überlastung ist, wenn Sie zwei Methoden mit dem gleichen Namen definieren, sondern verschiedene Parameter

überwiegendes ist, wo Sie das Verhalten der Basisklasse mit dem gleichen Namen in einer Unterklasse über eine Funktion ändern.

So Polymorphismus bezieht sich auf zwingende, aber nicht wirklich zu überlasten.

Aber wenn mir jemand eine einfache Antwort von „zwingenden“ für die Frage gibt: „Was ist Polymorphismus?“ Ich würde für eine weitere Erklärung bitten.

überwiegendes ist mehr wie eine geerbte Methode versteckt durch eine Methode mit dem gleichen Namen und Unterschrift als obere Ebene Methode (Super-Methode) erklärt, dies verleiht ihm einen polymorphen Verhalten der Klasse. in anderen Worten, die Entscheidung weicht Ebene Methode auszuwählen aufgerufen wird, wird zur Laufzeit vorgenommen wird Zeit nicht kompilieren. dies führt zu dem Konzept der Schnittstelle und Implementierung.

  

Was ist Polymorphismus?

Von java Tutorial

Die Wörterbuch-Definition von Polymorphie bezieht sich auf ein Prinzip in der Biologie, in dem ein Organismus oder Arten kann viele verschiedene Formen oder Stufen haben. Dieses Prinzip kann auch auf die objektorientierte Programmierung und Sprachen wie Java-Sprache verwendet werden. Subklassen einer Klasse können ihre eigenen einzigartigen Verhaltensweisen definieren und noch einige der gleichen Funktionalität der übergeordneten Klasse teilen.

Durch die Beispiele und Definition unter Berücksichtigung Überschreiben sollte akzeptierte Antwort sein.

In Bezug auf Ihre zweite Abfrage:

  

Wenn Sie hatte eine abstrakte Basisklasse, die eine Methode ohne Implementierung definiert, und Sie definiert diese Methode in der Unterklasse, ist, dass nach wie vor overridding?

Es sollte überwiegende aufgerufen werden.

Haben Sie einen Blick auf dieses Beispiel verschiedene Arten von übergeordnetem zu verstehen.

  1. Basisklasse stellt keine Implementierung und Unterklasse hat die komplette Methode außer Kraft zu setzen - (Zusammenfassung)
  2. Basis-Klasse stellt Standardimplementierung und Unterklasse kann das Verhalten ändern
  3. Unterklasse fügt Erweiterung Basisklassenimplementierung von super.methodName() als erste Anweisung aufrufen
  4. Basisklasse definiert Struktur des Algorithmus (Template-Methode) und Unterklasse wird ein Teil des Algorithmus außer Kraft setzen

Code-Snippet:

import java.util.HashMap;

abstract class Game implements Runnable{

    protected boolean runGame = true;
    protected Player player1 = null;
    protected Player player2 = null;
    protected Player currentPlayer = null;

    public Game(){
        player1 = new Player("Player 1");
        player2 = new Player("Player 2");
        currentPlayer = player1;
        initializeGame();
    }

    /* Type 1: Let subclass define own implementation. Base class defines abstract method to force
        sub-classes to define implementation    
    */

    protected abstract void initializeGame();

    /* Type 2: Sub-class can change the behaviour. If not, base class behaviour is applicable */
    protected void logTimeBetweenMoves(Player player){
        System.out.println("Base class: Move Duration: player.PlayerActTime - player.MoveShownTime");
    }

    /* Type 3: Base class provides implementation. Sub-class can enhance base class implementation by calling
        super.methodName() in first line of the child class method and specific implementation later */
    protected void logGameStatistics(){
        System.out.println("Base class: logGameStatistics:");
    }
    /* Type 4: Template method: Structure of base class can't be changed but sub-class can some part of behaviour */
    protected void runGame() throws Exception{
        System.out.println("Base class: Defining the flow for Game:");  
        while ( runGame) {
            /*
            1. Set current player
            2. Get Player Move
            */
            validatePlayerMove(currentPlayer);  
            logTimeBetweenMoves(currentPlayer);
            Thread.sleep(500);
            setNextPlayer();
        }
        logGameStatistics();
    }
    /* sub-part of the template method, which define child class behaviour */
    protected abstract void validatePlayerMove(Player p);

    protected void setRunGame(boolean status){
        this.runGame = status;
    }
    public void setCurrentPlayer(Player p){
        this.currentPlayer = p;
    }
    public void setNextPlayer(){
        if ( currentPlayer == player1) {
            currentPlayer = player2;
        }else{
            currentPlayer = player1;
        }
    }
    public void run(){
        try{
            runGame();
        }catch(Exception err){
            err.printStackTrace();
        }
    }
}

class Player{
    String name;
    Player(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
}

/* Concrete Game implementation  */
class Chess extends Game{
    public Chess(){
        super();
    }
    public void initializeGame(){
        System.out.println("Child class: Initialized Chess game");
    }
    protected void validatePlayerMove(Player p){
        System.out.println("Child class: Validate Chess move:"+p.getName());
    }
    protected void logGameStatistics(){
        super.logGameStatistics();
        System.out.println("Child class: Add Chess specific logGameStatistics:");
    }
}
class TicTacToe extends Game{
    public TicTacToe(){
        super();
    }
    public void initializeGame(){
        System.out.println("Child class: Initialized TicTacToe game");
    }
    protected void validatePlayerMove(Player p){
        System.out.println("Child class: Validate TicTacToe move:"+p.getName());
    }
}

public class Polymorphism{
    public static void main(String args[]){
        try{

            Game game = new Chess();
            Thread t1 = new Thread(game);
            t1.start();
            Thread.sleep(1000);
            game.setRunGame(false);
            Thread.sleep(1000);

            game = new TicTacToe();
            Thread t2 = new Thread(game);
            t2.start();
            Thread.sleep(1000);
            game.setRunGame(false);

        }catch(Exception err){
            err.printStackTrace();
        }       
    }
}

Ausgabe:

Child class: Initialized Chess game
Base class: Defining the flow for Game:
Child class: Validate Chess move:Player 1
Base class: Move Duration: player.PlayerActTime - player.MoveShownTime
Child class: Validate Chess move:Player 2
Base class: Move Duration: player.PlayerActTime - player.MoveShownTime
Base class: logGameStatistics:
Child class: Add Chess specific logGameStatistics:
Child class: Initialized TicTacToe game
Base class: Defining the flow for Game:
Child class: Validate TicTacToe move:Player 1
Base class: Move Duration: player.PlayerActTime - player.MoveShownTime
Child class: Validate TicTacToe move:Player 2
Base class: Move Duration: player.PlayerActTime - player.MoveShownTime
Base class: logGameStatistics:

Ich glaube, Jungs Ihre Konzepte mischen. Polymorphismus ist die Fähigkeit eines Objekts zur Laufzeit verhalten sich anders. Um dies zu erreichen, müssen Sie zwei Voraussetzungen:

  1. Späte Bindung
  2. Vererbung.

Nachdem das nun gesagt, dass Überlastung bedeutet, etwas anderes zu Überschreiben in Abhängigkeit von der Sprache, die Sie verwenden. Zum Beispiel in Java existiert nicht Überschreiben und Überlastung . Überladene Methoden mit unterschiedlichen Signaturen zu ihrer Basisklasse sind in der Unterklasse zur Verfügung. Andernfalls würden sie außer Kraft gesetzt (bitte, dass ich meine jetzt die Tatsache, gibt es keine Möglichkeit Ihre Basisklasse Methode von außerhalb des Objekts zu nennen).

Jedoch in C ++, die nicht so ist. Alle überlastet Methode, unabhängig davon, ob die Signatur die gleiche oder nicht (diffrrent Menge, anderer Typ) ist auch außer Kraft gesetzt . Das zu Tag ist, die Basisklasse Methode ist nicht mehr verfügbar in der Unterklasse, wenn sie von außerhalb des Unterklasse-Objekts aufgerufen wird, offensichtlich.

Die Antwort ist also, wenn man über Java Verwendung sprechen Überlastung . In einer anderen Sprache kann unterschiedlich sein, wie es in c geschieht ++

Obwohl Polymorphismus bereits erklärt, in großen details in diesem post, aber ich möchte mehr darauf an, warum ein Teil davon.

Warum Polymorphismus ist so wichtig in jedem OOP-Sprache.

Lassen Sie uns versuchen, eine einfache Anwendung erstellen, die für eine TV-mit und ohne Vererbung/Polymorphismus.Post jede version der Anwendung, machen wir eine kleine Retrospektive.

Angenommen, Sie sind ein software-Ingenieur bei einer TV-Firma, und Sie werden gebeten, zu schreiben-software für Volumen, Helligkeit und Farbe Controller zu erhöhen und verringern Ihre Werte auf user-Befehl.

Starten Sie mit dem schreiben von Klassen für jede dieser Funktionen durch das hinzufügen

  1. set:- Um einen Wert von einem controller.(Angenommen dieser hat-controller-spezifischen code)
  2. bekommen:- Um einen Wert eines Controllers.(Angenommen dieser hat-controller-spezifischen code)
  3. passen Sie:- überprüfen Sie die Eingabe und Einstellung, ein regler.(Generic Validierungen..unabhängig von Controller)
  4. user input mapping mit Controllern :- Um Benutzer-Eingabe und aufrufen der Controller entsprechend.

Application 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 der Anwendung arbeitet bereitgestellt werden.Zeit zu analysieren, die Arbeit so weit.

Fragen in TV Application Version 1

  1. Anpassen(int value) code duplizieren in allen drei Klassen.Sie möchten, minimieren Sie den code Doppelzüngigkeit.(Aber Sie wusste nicht, dass der gemeinsame code und bewegte Sie in einigen super Klasse, Vermeidung doppelter code)

Sie entscheiden, zu Leben, solange Ihre Anwendung wie erwartet funktioniert.

Nach manchmal, dein Chef kommt zu dir zurück und fordert Sie auf add reset-Funktionen zu der bestehenden Anwendung.Zurücksetzen würde alle 3-controller auf Ihre jeweiligen Standardwerte.

Sie zu schreiben beginnen, eine neue Klasse (ResetFunctionV2) für die neuen Funktionen und anzeigen der Nutzer-input-mapping-code für dieses neue feature.

Application 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;
            }

        }
    }
}

So haben Sie Ihre Anwendung bereit, mit Reset-Funktion.Aber jetzt beginnen Sie zu realisieren, dass

Fragen in TV-Anwendung, Version 2

  1. Wenn ein neuer controller eingeführt, um die Produkt, Sie haben zu ändern Reset-Funktion code.
  2. Wenn die Anzahl der controller wächst sehr hoch, Sie würde haben Problem in holding-die Referenzen von die Controller.
  3. Reset-Funktion code ist eng gekoppelt mit alle die Controller-Klasse s-code(für get-und set-default-Werte).
  4. Reset feature-class (ResetFunctionV2) können auf eine andere Methode der Controller-Klasse s (anpassen), die ist unerwünscht.

Zur gleichen Zeit, Sie von Ihnen zu hören, Boss, die Sie vielleicht hinzufügen, ein feature, bei jedem von Controllern, die auf start-up, Bedürfnisse zu überprüfen die neueste version des Treibers von der Firma gehostet Treiber-repository über das internet.

Jetzt können Sie beginnen, denken, dass diese neue Funktion, die Hinzugefügt werden, ähnelt mit Reset-Funktion und Fragen der Anwendung (V2) wird multipliziert werden, wenn Sie nicht re-Faktor Ihrer Anwendung.

Beginnen Sie denken, Vererbung, so dass Sie nehmen Vorteil von polymorphe Fähigkeit von JAVA, und fügen Sie eine neue abstrakte Klasse (ControllerV3) zu

  1. Deklarieren Sie die Signatur der get-und set-Methode.
  2. Enthalten einstellen Methode der Umsetzung, war früher repliziert alle Steuerungen.
  3. Erklären setDefault Methode so, dass die reset-Funktion kann problemlos realisiert werden Nutzung von Polymorphismus.

Mit diesen Verbesserungen haben, version 3 Ihres TV-Anwendung bereit mit Ihnen.

Application 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 Problem aufgeführt in der Problem-Liste von V2 gerichtet waren, außer

Fragen in TV Application Version 3

  1. Reset feature-class (ResetFunctionV3) können auf eine andere Methode der Controller-Klasse s (anpassen), die ist unerwünscht.

Wieder, denken Sie, dieses problem zu lösen, so Sie haben jetzt eine andere Funktion (Treiber-Updates beim Start) zu implementieren als gut.Wenn Sie repariere es nicht, es wird repliziert, um neue features sowie.

So teilen Sie den Vertrag definiert, die in der abstrakten Klasse und Schreibe 2-Schnittstellen für

  1. Reset-Funktion.
  2. Treiber Update.

Und haben Ihre 1. konkrete Klasse implementieren, die Sie, wie unten

Application 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, alle die Problem konfrontiert, durch die Sie angesprochen habe und Sie erkannte, dass mit der Nutzung von Vererbung und Polymorphie Sie könnte

  1. Halten Sie die verschiedenen Teil-Anwendung lose gekoppelt.( Reset-oder Treiber-Update-feature Komponenten nicht muss bewusst gemacht werden, der eigentliche controller-Klassen(Lautstärke, Helligkeit und Farbe), jede Klasse implementieren der OnReset oder OnStart akzeptiert wird Zurückgesetzt oder Treiber-Update-feature Komponenten beziehungsweise).
  2. Anwendung Erweiterung wird einfacher.(Neue Ergänzung der controller wird nicht Einfluss reset-oder Treiber-update-feature-Komponente, und es ist jetzt wirklich einfach für Sie, um neue hinzufügen)
  3. Halten die Ebene der Abstraktion.(Jetzt Reset-Funktion sehen Sie nur setDefault Methode der Controller-und Reset-Funktion sehen Sie nur checkForDriverUpdate Methode der Controller)

Hoffe, das hilft :-)

Polymorphismus ist eher so weit wie es ist bedeutet ist besorgt, ... zu überwiegende in Java

Es geht um ein anderes Verhalten des gleichen Objekts in verschiedenen Situationen (In Programmierung Art und Weise ... können Sie verschiedene ARGUMENTE nennen)

ich glaube, das Beispiel unten werden Ihnen helfen, zu verstehen ... Obwohl es nicht reiner Java-Code ist ...

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

Aber wenn wir das Argument ändern ... wird das Verhalten geändert werden ...

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

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

Polymorphismus ist ein mehrere Implementierungen eines Objekts oder könnten Sie mehrere Formen eines Objekts sagen. können sagen, Sie Klasse Animals als abstrakte Basisklasse, und es hat eine Methode namens movement() haben, die die Art und Weise, dass das Tier bewegt definiert. Jetzt in Wirklichkeit haben wir verschiedene Arten von Tieren, und sie bewegen sich anders als auch einige von ihnen mit zwei Beinen, andere mit 4 und einige ohne Beine, etc .. Um verschiedene movement() jedes Tier auf der Erde zu definieren, müssen wir Polymorphismus anzuwenden. Allerdings müssen Sie Ihnen mehr Klassen d Klasse Dogs Cats Fish usw. Dann müssen definieren, um diese Klassen von der Basisklasse Animals erweitern und seine Methode movement() außer Kraft setzen mit einer neuen Bewegung Funktionalität auf jedes Tier basierend Sie haben. Sie können auch die Verwendung Interfaces zu erreichen. Das Schlüsselwort hier ist überschreiben, Überlastung unterschiedlich ist und nicht als Polymorphismus betrachtet. mit Überlastung können Sie mehrere Methoden „mit dem gleichen Namen“ definieren, aber mit unterschiedlichen Parametern auf demselben Objekt oder Klasse.

Polymorphismus bezieht sich auf die Fähigkeit einer Sprache einheitlich unter Verwendung eines einzelnen Schnittstellen behandelt anderes Objekt zu haben; Als solches ist es zum Überschreiben im Zusammenhang, so dass die Schnittstelle (oder die Basisklasse) polymorph ist, die Implementierer das Objekt ist, das (zwei Seiten derselben Medaille) überschreibt

Wie auch immer, der Unterschied zwischen den beiden Begriffen besser erklärte mit anderen Sprachen wie C ++: ein polymorphes Objekt in C ++ verhält sich wie das Java-Gegenstück, wenn die Basisfunktion virtuell ist, aber wenn die Methode des Code Sprung ist nicht virtuell ist aufgelöst statisch , und die wahre Art nicht so zur Laufzeit überprüft, Polymorphismus die Möglichkeit, ein Objekt zu verhalten sich unterschiedlich in Abhängigkeit von der verwendeten Schnittstelle für den Zugriff auf sie enthält; Lassen Sie mich ein Beispiel, in Pseudo-Code machen:

class animal {
    public void makeRumor(){
        print("thump");
    }
}
class dog extends animal {
    public void makeRumor(){
        print("woff");
    }
}

animal a = new dog();
dog b = new dog();

a.makeRumor() -> prints thump
b.makeRumor() -> prints woff

(unter der Annahme, dass makeRumor nicht virtuell ist)

java bietet nicht wirklich dieses Niveau des Polymorphismus (so genannte Objekt Slicing auch).

Tier a = new Hund ();     Hund b = new Hund ();

a.makeRumor() -> prints thump
b.makeRumor() -> prints woff

auf beiden Fällen wird es nur woff drucken .. da a und b beziehen Klasse Hund

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

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