2014-09-18 29 views
5

我不知道如何描述我的問題,所以我會給你一個快速解釋。使用抽象方法而不是字段

我想製作一個程序,用戶可以選擇一種語言,然後以該語言打印文本。目前,我想到的是這樣的:

// Super | class Language; 
// Sub | --- class German; 
// Sub | --- class English; 

if(UserChoseEnglish()) 
    language = new English(); 
else 
    language = new German(); 

英語和德語具有相同的公共靜態最終字段,使我能夠使用language.anyMethod();由用戶的選擇給出。 AFAIK你不能重寫字段,所以我在考慮把抽象方法(在超類)中的所有字段打包,只返回值並覆蓋這些值。

public abstract class Language 
{ 
    public abstract String thanks(); 
} 

public class English extends Language 
{ 
    @Override 
    public String thanks() 
    { 
    return "Thanks!"; 
    } 
} 

public class German extends Language 
{ 
    @Override 
    public String thanks() 
    { 
    return "Danke!"; 
    } 
} 

這被認爲是不好的做法?我應該重寫getter-methods嗎?還是我錯過了一些我不知道的東西?如果你想幫忙,會很好。

(我目前只是在玩Java,並認爲選擇語言會很有趣,如果你有經驗可以共享(圖書館,房地產......),請隨時這樣做:))

+0

看看[本教程](http://docs.oracle.com/javase/tutorial/i18n/),具體地約使用'ResourceBundle'部件。 – azurefrog 2014-09-18 21:01:07

+0

而不是使用很多方法,你可以考慮使用一個像'general.save'這樣的鍵的映射,值是字符串的本地化。這樣你就避免了這種方法,你可以將你的條目分組。你也可以考慮使用'Language'接口中定義的常量作爲鍵。同一個接口可以定義一個像String getText(final String key)這樣的方法;'這將返回所用語言的本地化文本。除了語言類和這個接口,你還需要一些類似於'LanguageHandler'的類來提供'Language'實例的實例。 – Tom 2014-09-18 21:19:26

回答

7

如果問題確實是I18N,那麼您應該查看ResourceBundles,就像@azurefrog建議的一樣。除此之外,這是一個很好的OO設計 - 基類定義了一個方法(thanks()),每個具體的子類都實現了它。

相關問題