2014-09-18 15 views
5

Nie wiem, jak opisać mój problem, więc dam ci szybkie wyjaśnienie.Użyj metod abstrakcyjnych zamiast pól

Chcę zrobić program, w którym użytkownik może wybrać język, a następnie tekst zostanie wydrukowany w tym języku. Obecnie mam na myśli coś takiego:

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

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

angielski i niemiecki mają takie same statyczne pola końcowe publicznych, tak, że jestem w stanie wykorzystać language.anyMethod(); który jest dany przez wybór użytkownika. AFAIK, nie można przesłonić pól, więc zastanawiałem się nad spakowaniem wszystkich pól w abstrakcyjnych metodach (w superklasie), które tylko zwracają wartość i nadpisują te.

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!"; 
    } 
} 

Czy uważa się to za złą praktykę? Czy powinienem po prostu przesłonić metody gettera, czy też po prostu tęsknię za czymś, o czym nie wiem? Byłoby miło, gdybyś pomógł.

(Obecnie po prostu bawię się na Jawie i uważam, że wybór języka będzie całkiem przyjemny, jeśli masz doświadczenie w udostępnianiu (biblioteki, właściwości, ...?), Możesz to zrobić) :)

+0

Spójrz na [ten samouczek] (http://docs.oracle.com/javase/tutorial/i18n/), w szczególności części dotyczące korzystania z 'ResourceBundle' . – azurefrog

+0

Zamiast używać wielu metod, można pomyśleć o używaniu mapy z kluczem takim jak "general.save", a wartość jest lokalizacją ciągu. W ten sposób unikasz tych metod i możesz grupować swoje wpisy. Możesz także pomyśleć o użyciu stałych zdefiniowanych w interfejsie 'Język' jako kluczy. Ten sam interfejs może definiować metodę taką jak 'String getText (final String key);', która zwróci zlokalizowany tekst dla używanego języka. Oprócz klas językowych i tego interfejsu potrzebujesz czegoś takiego jak klasa 'LanguageHandler', która udowodniła instancje dostępnych instancji' Language'. – Tom

Odpowiedz

7

Jeśli problem jest naprawdę I18N, prawdopodobnie powinien zajrzeć do ResourceBundles, jak zasugerował @ Azurfrog. Poza tym jest to dźwiękowy projekt OO - klasa podstawowa definiuje metodę (thanks()), a każda konkretna podklasa ją implementuje.

Powiązane problemy