2017-03-10 3 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"이며 코드의 두 번째 조각에 선언이 표시됩니다 –

+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

이해하지만, 불행히도 나는 정교화 논리를 클래스 자체로 옮길 수 없습니다 ... –

관련 문제