2017-03-27 10 views
0

まず、私はそのJavaの多相性関数は、それがパラメータインスタンスの型によってマップされています。Java多形性と継承の問題

私の機能がmyFunction(EmployeeImpl emp)に署名していない理由を説明するのに役立つ人は、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()); 
    } 
} 

結果:従業員:EmployeeImpl

編集:これはと呼ばれる同じ機能が含まれている20の以上の子供たちのクラスがあり、私の現実のアプリケーション、同じ構造を持つだけのサンプルアプリケーションですcallMyFunctionの場合、この関数には20行以上のコードがあります。だから私はoverrideすべての子供のための同じコードコードでこの機能に非常に難しい仕事です。とにかく、私の将来の機能を変えなければならないとどうなりますか?私は同じコードで20の機能をすべて変更できますか?

これよりも簡単ですか?

+2

あなたは 'EmployeeImplで' callMyFunction'をオーバーライドしていないので'。オーバーロードされたメソッドを呼び出すと、コンパイル時にどのメソッドが使用されるかが決定されます。したがって、実行時にこのクラスがどのように継承されても問題ありません。 – align

+0

@alignがあなたのコメントよりもはるかに優れた動作を説明したため、コメントを編集しています。私はこのコメントを追加します:あなたがしたmain()で何が起こるかを見てください。EmployeeImpl emp = new EmployeeImpl();代わりに – muzzlator

+0

私は自分の機能を無効にする必要がありますか? myfunctionが非常に抱擁のコード量の場合はどうでしょうか?サブクラスでもう一度書き直す必要がありますか? –

答えて

2

私の第一の溶液は、EmployeeEmployeeImpl及び他のサブクラスにEmployeeFacadeからmyFunctionを移動し、従って、直接仮想メソッドを使用することであろう。いくつかの理由でこれができない場合は、私の次のソリューションは、Employeeに仮想「プロキシ」機能を導入し、適切に呼び出しをディスパッチするためにそれを使用することになります。

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

これは便利です。期待どおりに動作し、書き換えにはごくわずかです。ありがとう –

8

Javaがオーバーロードされたメソッドのための結合、およびオーバーライドされたもののために動的バインディング静的使用しています...オーバーロードされたメソッドの動的バインディングは存在しないでください。

Java dynamic binding and method overriding

3

はポリモーフィズム

1)静的ポリモーフィズム

2)動的多型の2種類があります

あなたのコードを、それはのデバッグ場合は、あなたの場合は、静的ポリモーフィズム

です常に

と呼ばれる
public static void myFunction(Employee emp){ 
    System.out.println("Employee: "+ emp.getClass().getName()); 
} 

とgetClass()メソッドを持つすべてのクラスは、呼び出されたメソッドを持つオブジェクトの実行時クラスを返します。ここ は、Objectクラス

public final native Class<?> getClass(); 

のJDKの実装であり、それはクラスのクラスの実装

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

こので表されるエンティティー(クラス、インタフェース、配列クラス、プリミティブ型、またはvoid)の名前を返しますStringオブジェクトとしてのClassオブジェクト(私はコメントで示唆したように)

+0

私は20を超える子クラスを持ち、 'callMyFunction'の中にコードの量を抱えているので、それを動的にすることができますか?とにかくファサード機能は異なった仕事をします。 –