【问题标题】:Factory with Generics when Argument type is unclear参数类型不明确时使用泛型的工厂
【发布时间】:2013-10-02 13:37:30
【问题描述】:

我的任务是创建一个翻译器,正如我在本线程前面所讨论的那样。 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,而不是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 子类型的方式进行翻译。有一对一的匹配。但是,我在设计时不知道这一点!我需要像工厂这样的东西来为我创建这个翻译器,对吧?其他方法?双重派送?

【问题讨论】:

  • 您能展示一下您用于翻译的实际方法吗?你在使用OriginalText类的一些翻译方法吗?
  • 请指定您希望如何呼叫翻译。您可以在运行时使用 Object#getClass() 从实例中获取文本的实现类,所以我看不出区别...
  • 先回答你最后一个问题:是的,OriginalText的所有子类都有共同的属性,需要翻译(所以,接口上的抽象类)。要回答您的第一个问题:翻译人员应该简单地阅读 OrignalText 子类的特殊属性,并将其复制到 LanguageTranslation 并进行细微的更改和翻译。没有什么特别的,但肯定会为每个人提供适当的待遇。
  • Translator 是抽象的。那你怎么办new Translator&lt;OriginalText, V&gt;()
  • @newacct 是的,废话。我基本上宁愿寻找一种方法,而不是为我编写代码的人。抱歉,我不清楚。

标签: java generics


【解决方案1】:

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

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

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

【讨论】:

  • 我对每种源语言都有一个类,因为它们可能被不同的方法翻译。使用不同的方法、属性等。我之前正在使用 if-ladders 研究工厂模式。我不喜欢 if-ladders 的方法。我宁愿选择一个决定类使用的实现的类。类似于访问者模式的重载方法。但那是单发的。嗯。我认为具有挑战性。我需要看看这样的东西。 stackoverflow.com/questions/12628251/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多