2013-10-02 39 views
1

我的任务是创建一个翻译器,就像我在前面讨论过的那样。 How do you use a generic type as return value and a generic type as a parameter?当参数类型不清时,使用泛型的工厂

简而言之,我有一种语言需要在另一种语言中翻译。喜欢这个。

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

的新的挑战是,在设计时我没有得到一个子类的OriginalText翻译,而是超类OriginalText的一个实例。因此,当我呼叫translate函数的实现时,我可以设置特定的LanguageTranslation V,但需要保留OriginalText,与EnglishText,ChineseText等对应,它们是子类。

// 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子类型翻译。有一对一的匹配。但是,在设计时我不知道这一点!我需要像Factory一样为我创建这个翻译器,对吧?其他方法?双派遣?

+0

你能展示你用于翻译的实际方法吗?你是否使用'OriginalText'类的一些翻译方法? –

+0

请指定您想要给翻译者打电话的方式。您可以在运行时使用Object#getClass()从实例中获取文本的实现类,这样我就不会看到区别... – AlexR

+0

首先回答您最后一个问题:是的,常见的属性是所有子类的OriginalText有共同点,需要翻译(所以,抽象类的接口)。回答你的第一个问题:翻译者应该简单地阅读OrignalText子类的特殊属性,并将其复制到LanguageTranslation中,并稍作修改和翻译。没有什么特别的,但肯定是适当的治疗每个。 – feder

回答

1

首先,我认为你的翻译应该是一个接口,而不是一个类。 我也不确定我是否明白为什么每个源语言都有一门课。

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

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

+0

我对每种源语言都有一个类,因为它们可能会通过不同的方法进行翻译。使用不同的方法,属性等。我之前正在用if-ladders调查工厂模式。我不喜欢if-ladders的方法。我宁愿是一个决定一个班级使用的实践的班级。类似于访问者模式的重载方法。但是这是单一派遣。嗯。挑战,我想。我需要看这样的事情。 HTTP://计算器。COM /问题/ 12628251/Java的工厂模式与 - 仿制药 – feder