2017-03-27 4 views
0

Erstens ich aber, dass Polymorphismus Funktionen des Java sind es Typen von Parameter-Instanz zugeordnet.java Polymorphismus und Vererbung Probleme

Bitte, jemand zu helfen, zu erklären, warum meine Funktion nicht myFunction(EmployeeImpl emp) angerufen hat, ist es Instanz EmployeeImpl.

public class MainApp { 
    public static void main(String[] args){ 
    Employee emp = new EmployeeImpl(); 
    emp.callMyFunction(); 
    } 
} 

abstract class Employee{ 
    public void callMyFunction(){ 
    //here is huge amount of code, which all child class has the same 
    //excepted this line is called to a different function by it instant types. 
    EmployeeFacade.myFunction(this); 
    } 
} 
class EmployeeImpl extends Employee{ 

} 
class EmployeeFacade{ 
    public static void myFunction(Employee emp){ 
    //same data to database 
    System.out.println("Employee: "+ emp.getClass().getName()); 
    } 
    public static void myFunction(EmployeeImpl emp){ 
    //same data to database 
    System.out.println("EmployeeImpl: "+ emp.getClass().getName()); 
    } 
} 

Ergebnis: Mitarbeiter: EmployeeImpl

Edited: Dies ist nur eine Beispielanwendung, mit der gleichen Struktur wie meine Reality-Anwendung, die mehr als 20 Kinder Klassen hat, die die gleiche Funktion enthält genannt callMyFunction, diese Funktion hat mehr als 20 Zeilen Code. so ist es eine sehr harte Arbeit für mich, override diese Funktion mit dem gleichen Code-Code für alle Kinder-Klasse. Wie auch immer, was passiert, wenn ich meine Funktion in der Zukunft ändern muss? Würde ich alle 20 Funktionen mit demselben Code ändern?

Gibt es sowieso einfacher als das?

+2

Weil Sie nicht zwingend 'callMyFunction' im' EmployeeImpl '. Wenn Sie eine überladene Methode aufrufen, wird bei der Kompilierung festgestellt, welche Methode verwendet wird. Also egal wie diese Klasse zur Laufzeit vererbt wird. – align

+0

Kommentar bearbeiten, weil @align das Verhalten erklärt hat, das Sie viel besser als mein Kommentar gesehen haben. Ich werde diesen Kommentar jedoch hinzufügen: Schau, was passieren würde, wenn in main() du getan hättest EmployeeImpl emp = new EmployeeImpl(); stattdessen – muzzlator

+0

Also, muss ich meine Funktion überschreiben? was ist, wenn meine Funktion sehr viel Code ist. Muss ich es nochmal in meiner Unterklasse umschreiben? –

Antwort

2

Meine erste Lösung (wie ich in den Kommentaren vorgeschlagen) wäre myFunction vom EmployeeFacade-Employee, EmployeeImpl und anderen Unterklassen zu bewegen und somit direkt virtuelle Methoden. Wenn dies aus irgendwelchen Gründen nicht möglich ist, wäre meine nächste Lösung virtuellen „Proxy“ -Funktion Employee einführen und die Verwendung dieses Anruf richtig versenden:

public class MainApp { 
    public static void main(String[] args){ 
    Employee emp = new EmployeeImpl(); 
    emp.callMyFunction(); 
    } 
} 

abstract class Employee 
{ 
    public void callMyFunction() 
    { 
     //here is huge amount of code, which all child class has the same 
     //excepted this line is called to a different function by it instant types. 
     callMyFunctionImpl(); 
    } 

    protected void callMyFunctionImpl() 
    { 
     EmployeeFacade.myFunction(this); 
    } 
} 

class EmployeeImpl extends Employee 
{ 
    @Override 
    protected void callMyFunctionImpl() 
    { 
     EmployeeFacade.myFunction(this); 
    } 
} 

class EmployeeFacade 
{ 
    public static void myFunction(Employee emp) 
    { 
     //same data to database 
     System.out.println("Employee: " + emp.getClass().getName()); 
    } 

    public static void myFunction(EmployeeImpl emp) 
    { 
     //same data to database 
     System.out.println("EmployeeImpl: " + emp.getClass().getName()); 
    } 
} 
+0

Nun, das ist nützlich, funktioniert wie erwartet und sehr wenig Code neu geschrieben werden. Vielen Dank –

8

Existieren für überladene Methoden ...

Java verwendet statische für überladene Methoden Bindung und dynamische Bindung für überschriebene diejenigen nicht dynamische Bindung.

Java dynamic binding and method overriding

3

Es gibt 2 Arten von Polymorphismus

1) Statische Polymorphismus

2) Dynamische Polymorphismus

der Fall ist statische Polymorphismus

Wenn Sie Ihren Code debuggen es immer

genannt
public static void myFunction(Employee emp){ 
    System.out.println("Employee: "+ emp.getClass().getName()); 
} 

und jede Klasse mit getClass() Methode und es ist die Laufzeit-Klasse des Objekts zurück, das Verfahren hat genannt. ist hier JDK-Implementierung von Objektklasse

public final native Class<?> getClass(); 

und es ist Klasse Klasse Implementierung

public String getName() { 
    String name = this.name; 
    if (name == null) 
     this.name = name = getName0(); 
    return name; 
} 

den Namen des Unternehmens Returns (Klasse, Interface, Array-Klasse, Urtyp oder void) durch diese vertreten Klassenobjekt als String

+0

Gibt es sowieso, um es dynamisch zu machen, weil ich mehr als 20 Kinder-Klassen habe und Menge Code in 'CallMyFunction' umarmen. Anyways Fassadenfunktion sind verschiedene Aufgaben. –