1

我的任务是创建一个翻译器,正如我在本线程前面所讨论的那样。如何使用泛型类型作为返回值和泛型类型作为参数?

简而言之,我有一种语言需要翻译成另一种语言。像这样。

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

新的挑战是,在设计时我没有得到一个OriginalText要翻译的子类,而是一个超类的实例OriginalText。因此,当我调用translate函数的实现时,我可以设置特定的LanguageTranslationV,但需要保留OriginalText,与 , 等相反EnglishTextChineseText它们是子类。

// 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))   

我希望我的翻译器 - 或工厂 - 以特定于OriginalText(子类有几个不同的属性)和LanguageTranslation我提供的子类型的方式进行翻译。有一对一的匹配。但是,我在设计时不知道这一点!我需要像工厂这样的东西来为我创建这个翻译器,对吧?其他方法?双发?

4

1 回答 1

1

首先,我认为您的 Translator 应该是一个接口,而不是一个类。我也不确定我是否理解为什么您为每种源语言都有一个课程。

话虽这么说,在您的设计中的某个地方,您将需要一个黑匣子来获取通用文本对象并返回相应的翻译器。只要您返回与输入类型匹配的翻译器,您就可以忍受缺少使用 OriginaText 的翻译器的静态类型安全性。请注意,这个黑匣子不会成为翻译器。它应该是可以提供适当提供者的东西。如果您确实需要每个文本的新翻译器实例,这可以是一个抽象工厂(http://en.wikipedia.org/wiki/Abstract_factory_pattern

这个工厂的实现取决于你的程序。如果您的语言集有限,则可以有一堆 if 语句使用有关 OriginalText 的数据(例如它的实际类名或文本中的一些线索)。如果这是灵活的,您可以编写为特定标准注册具体翻译的供应商的逻辑,然后以编程方式找到与给定文本的标准匹配的第一个项目。

于 2013-10-03T05:20:19.697 回答