2013-10-02 36 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