2017-03-10 14 views
0

このクラスには、他のクラスから呼び出される一連の静的メソッドがあるコードが必要です。サブクラスの型に基づいて別のメソッドを呼び出す

私は、次のような階層で、いくつかの新しいクラスを作成しました:

public abstract class Superclass implements Comparable, Serializable 
{ 
    //Superclass stuff 
} 

public class MidClass extends Superclass implements Comparable, Serializable 
{ 
    //MidClass stuff 
} 

public class SubClass1 extends SuperClass implements Comparable, Serializable 
{ 
    //SubClass1 stuff 
} 

public class SubClass2 extends MidClass implements Comparable, Serializable 
{ 
    //SubClass2 stuff 
} 

私はすべての異なるサブクラスタイプごとに異なる静的メソッドを呼び出す必要があることを考えると、私はまた、過負荷に以下を追加しましたファーストクラスのメソッド:クラスで

public static objForMidClass elaborationMethod(MidClass midClass) 
{ 
    //Stuff to do with MidClass obj 
} 

public static objForSubClass1 elaborationMethod(SublClass1 subClass1) 
{ 
    //Stuff to do with SubClass1 obj 
} 

public static objForSubClass2 elaborationMethod(SubClass2 subClass2) 
{ 
    //Stuff to do with SubClass2 obj 
} 

私は

//Inside "object" and "inputList" Lists there's the correct type/subtype 

List<SuperClass> inputList = (List<SuperClass>) object; 

if (inputList != null && inputList.size() > 0) 
{ 
    for(Iterator<SuperClass> it = inputList.iterator(); it.hasNext();) 
    { 
     SuperClass item = it.next(); 

     //Next line gives the error: 
     //"elaborationMethod(MidClass) in the type classWithStaticMethods is not applicable for the arguments (Superclass)" 

     AnotherClass retItem = classWithStaticMethods.elaborationMethod(item); 

    { 
} 
ような何かをした静的メソッドを呼び出すところから

渡されたオブジェクトがSuperClassのサブクラスのすべての洞察であることを認識しないため、対応するSubClass型の静的メソッドを検索する必要があるのはなぜですか?

この状況をモデル化する正しい代替方法は何か教えてください。

+0

'classWithStaticMethods'の作成方法は不明です。 – freedev

+0

質問の冒頭で私が話していたのは「静的メソッドの束を持つ」クラスだけです。私が使用するオーバーロードされたメソッドは "elaborationMethod"であり、宣言はコードの2番目のスニペットに示されています –

+1

[パラメータの実際の型に基づいたオーバーロードされたメソッドの選択]の重複が考えられます(http://stackoverflow.com/questions/1572322/overloaded-メソッド選択に基づくパラメータの実数型) – Axel

答えて

0

overloadingメソッドからoverridingメソッドに切り替えて、staticelaborationMethodメソッドをそれぞれのクラスに移動する必要があります。

その時点であなたは、このように各itemについてelaborationMethodを呼び出すことができます。

item.elaborationMethod(); 

ちょうどあなたが、私はこの小さな例を書かれている理解できるようにします。 elaborationMethodに相当するprintNameメソッドを考えてみましょう。

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 

public class Polymorphism { 

    public static void main(String[] args) 
    { 
    List<SuperClass> inputList = new ArrayList<>(); 

    inputList.add(new SuperClass() {}); 
    inputList.add(new MidClass()); 
    inputList.add(new SubClass1()); 
    inputList.add(new SubClass2()); 

    for (SuperClass s : inputList) { 
     s.printName(); 
    } 

    } 

} 


abstract class SuperClass { 

    public void printName() 
    { 
    System.out.println("SuperClass"); 
    } 
} 


class MidClass extends SuperClass { 

    public void printName() 
    { 
    System.out.println("MidClass"); 
    } 
} 


class SubClass1 extends SuperClass { 

    public void printName() 
    { 
    System.out.println("SubClass1"); 
    } 
} 


class SubClass2 extends MidClass { 
    // Missing printName 
} 
+0

わかりましたが、残念ながら私はクラスに精巧なロジックを移すことはできません... –

関連する問題