2013-10-02 16 views
1

이 글의 앞부분에서 설명한대로 내 태스크는 변환기를 만드는 것입니다. How do you use a generic type as return value and a generic type as a parameter?인수 유형이 명확하지 않은 경우 Generics가있는 팩터

간단히 말하자면, 다른 언어로 번역해야하는 언어가 있습니다. 이렇게

public abstract class Translator <T extends OriginalText, V extends LanguageTranslation> {    
    public abstract V translate(T originalText); 
} 

새로운 도전은 디자인 타임에 내가 OriginalText의 하위 클래스는 번역하지 않지만, 슈퍼 클래스 OriginalText 오히려 인스턴스 있다는 것입니다. 따라서 translate 함수의 구현을 호출 할 때 특정 LanguageTranslation V를 설정할 수 있지만 하위 클래스 인 EnglishText, ChineseText 등과 반대 인 OriginalText을 유지해야합니다. OriginalText (서브 클래스가 여러 가지 속성이 있습니다)에 특정한 방식으로 내가 제공 한 LanguageTranslation 서브 타입에 번역 - 또는 공장 -

// I know response type V (specific class of LanguageTranslation) from a parameter from this function. 
// However, this is non-sense anyway, because Translator is abstract. 
Translator<OriginalText, V> translator = new Translator<OriginalText, V>(); 

// At design time, I have no clue what is returned by the repository. Hence, I expect the translate method to do the appropriate decision at run time. 
vType = translator.translate(repository.getTextObject(textId)) 

나는 나의 번역기합니다. 일대일 매칭이 있습니다. 그러나, 나는 이것을 디자인 타임에 모른다. 나에게이 번역기를 만드는 공장 같은 것이 필요해, 그렇지? 다른 접근법? 이중 파견?

+0

번역을 위해 사용하고있는 실제 방법을 보여줄 수 있습니까? 'OriginalText' 클래스의 번역 방법을 사용하고 있습니까? –

+0

통역자에게 전화 할 방법을 지정하십시오. 런타임시 Object # getClass()를 사용하여 인스턴스의 텍스트 구현 클래스를 얻을 수 있으므로 차이가 보이지 않습니다 ... – AlexR

+0

마지막 질문부터 대답하려면 : 예, 모든 하위 클래스 OriginalText는 공통점이있어서 번역해야합니다 (즉, 인터페이스를 통한 추상 클래스). 첫 번째 질문에 대답하려면 : 번역자는 하위 분류 된 OrignalText의 특수 특성을 읽고 사소한 변경 및 번역만으로 LanguageTranslation에 복사해야합니다. 특별한 것은 없지만 각각을위한 적절한 치료. – feder

답변

1

먼저 번역기가 클래스가 아닌 인터페이스 여야한다고 생각합니다. 각 소스 언어에 대한 수업이있는 이유를 잘 모르겠습니다.

당신의 디자인 어딘가에 말하면 일반 텍스트 객체를 가져 와서 해당 번역기를 반환하는 블랙 박스가 필요할 것입니다. 입력 유형과 일치하는 변환기를 반환하는 경우 OriginaText를 사용하는 변환기가 없어도 정적 유형 안전성이 부족한 상태로 살 수 있습니다. 이 블랙 박스는 번역가가 될 수 없습니다. 적절한 공급자를 제공 할 수있는 것이어야합니다. 각 텍스트에 대한 번역기의 새로운 인스턴스가 실제로 필요한 경우에는 추상 팩토리 (http://en.wikipedia.org/wiki/Abstract_factory_pattern)

이 될 수 있습니다.이 팩토리의 구현은 프로그램에 따라 다릅니다. 제한된 언어가있는 경우 OriginalText에 대한 데이터를 사용하는 if 문 (예 : 실제 클래스 이름 또는 텍스트의 단서)을 사용할 수 있습니다. 이것이 유연한 것이라면 특정 기준에 대한 구체적인 번역자 공급 업체를 등록한 논리를 작성한 다음 해당 텍스트가 주어진 기준과 일치하는 첫 번째 항목을 프로그래밍 방식으로 찾을 수 있습니다.

+0

서로 다른 접근 방식으로 번역 될 수 있기 때문에 각 소스 언어에 대한 클래스가 있습니다. 다른 방법, 속성 등을 사용하여 전에 사다리를 사용하여 공장 패턴을 조사했습니다. 나는 사다리의 접근법을 싫어한다. 나는 오히려 클래스에 의해 사용하는 imlementation을 결정하는 클래스에 대한 것이지만. 방문자 패턴의 오버로드 된 메소드와 비슷합니다. 그러나 그것은 단일 파견이다. 흠. 도전적입니다. 이런 식으로 봐야 해. http : // stackoverflow.com/questions/12628251/java-factory-pattern-with-generics – feder

관련 문제