2013-08-01 5 views
0

실제 설정은 약간 복잡하므로 더 일반적인 예를 공식화하겠습니다. 다음 클래스 (사용하여 Java의 구문을) 고려 : operationOnSetsOfNumbers()가 아니기 때문에 물론부모 생성자를 부모 내부에서 호출 할 수 있습니까?

Set someSet = new SetOfNumbers(...); 
System.out.println(someSet.subset(...).operationOnSetsOfNumbers()); 

, 이것은 컴파일되지 않습니다 : 나는 다음과 같은 코드를 작성할 수 있도록하고 싶습니다

class Set 
{ 
... 
    Set subSet(Element[] elementList) 
    { 
    ... 
    } 
} 

class SetOfNumbers extends Set 
{ 
... 
    int operationOnSetsOfNumbers() 
    { 
    ... 
    } 
} 

Set의 멤버 한 가지 해결책은 각 자식 클래스에 대해 subSet 메서드를 개별적으로 구현하여 매번 적절한 반환 형식을 지정하는 것입니다. 그러나 subSet 구현이 복잡하고 많은 자식이있는 경우에는 분명히 우아하지 않습니다. 어떻게 든 세트의 멤버 함수 내부에서 Set의 임의의 자식을 참조하는 방법을 원하지만이 방법은 생각할 수 없습니다. 어떤 아이디어? 다음과 같이

+1

다형성을 활용하고 서브 세트의 반환 값을 올바른 유형으로 캐스트 할 수 없습니까? – gareththegeek

+0

흠 ... 나는이 예제에서 당신이 할 수 있다고 생각합니다. 내 실제 코드에서 이것은 예외를 던지고 있지만 내 질문에 회피하려고 다른 합병증이 발생했습니다. 조사 할게. –

+0

간단한 대답은 기본 클래스에서 operationOnSetsOfNumbers 추상을 만들어 각각의 파생 클래스에 구현하는 것이라고 가정합니다. Java를 사용하면 필요한 경우 구현 메소드에서보다 구체적인 리턴 유형을 가질 수 있습니다. 생성자에서 너무 많은 일을하지 않도록주의 할 수 있습니까? 다른 방법 (특히 같은 클래스의 비 최종 방법)을 호출하면 고통의 세계로 이어집니다. 당신은 생성자 대신에 factory 메소드를 사용하는 것을 고려할 수 있습니까? – Stormcloud

답변

0

당신은 제네릭 혜택을 누릴 수 있습니다 : 당신이 SetOfNumbers 인스턴스에서 subSet() 방법을 호출 할 때

class Set<T extends Set<T>> 
{ 
    ... 
    T subSet(Element[] elementList) 
    { 
     ... 
    } 
} 

class SetOfNumbers extends Set<SetOfNumbers> 
{ 
    ... 
    int operationOnSetsOfNumbers() 
    { 
     ... 
    } 
} 

그래서, 반환 형식 대신 세트의 SetOfNumbers 될 것입니다. 따라서 subSet()을 호출 한 후 operationOnSetsOfNumbers을 호출 할 수 있습니다.

관련 문제