2010-03-28 6 views
0

다른 언어로 객체 데이터를 표시 할 수있는 MultiLingual 인터페이스를 만들어야합니다 (데이터 자체는 아니지만 "작성자", "제목"등의 소개).자바 인터페이스 사용

인쇄 된 데이터는 다음과 같습니다

public class Main { 

public static void main(String[] args){ 

    MultiLingual gatecrasher[]={ new Data(3,12,1998), 
           new Data(10,6,1924,MultiLingual.ENG), 
           new Book("LoTR", "Tolkien", "Amazon", 2010), 
           new Book("Tuesdays with Morrie", 
             "Mitch Albom", "Time Warner Books",2003, 
             MultiLingual.ENG), 
           new Money(1232895/33.0,MultiLingual.PL), 
           new Money(134566/23.0,MultiLingual.ENG), 
          }; 

    for(int i=0;i < gatecrasher.length;i++) 
    System.out.println(gatecrasher[i]+"\n"); 

    for(int i=0;i < gatecrasher.length;i++) 
    System.out.println(gatecrasher[i].get(MultiLingual.ENG)+"\n"); 

} 
} 

그래서 내가 다국어 인터페이스의 상수 ENG, PL뿐만 아니라 방법 GET를 소개합니다 (INT :

3 grudnia 1998 

10th of June 1924 

Autor: Tolkien 
Tytul: LoTR 
Wydawnictwo: Amazon 2010 

Author: Mitch Albom 
Title: Tuesdays with Morrie 
Publishing House: Time Warner Books 2003 

37 360,45 PLN 

5,850.70 GBP 

3rd of December 1998 

10th of June 1924 

Author: Tolkien 
Title: LoTR 
Publishing House: Amazon 2010 

Author: Mitch Albom 
Title: Tuesdays with Morrie 
Publishing House: Time Warner Books 2003 

37,360.45 GBP 

5,850.70 GBP 

테스트 코드는 다음과 같습니다 언어) :

public interface MultiLingual { 

int ENG = 0; 
int PL= 1; 

String get(int lang); 

} 

그리고 나서 책을 가지고 있습니다. 문제는 생성자로 시작됩니다. 그 중 하나는 MultiLingual.ENG를 인수로 받아 들일 필요가 있지만이를 달성하는 방법은 무엇입니까? 이것은 적절한 방법입니까? :

class Book implements MultiLingual { 

private String title; 
private String publisher; 
private String author; 

public Book(String t, String a, String p, int y, MultiLingual lang){  
} 

이 MultiLingual.ENG를 int 변수로 처리해야합니까? 아니면 인터페이스에서 자동으로 상수가 변경됩니까?

는 인수로 MultLingual을지지 않습니다 책,하지만 다음과 같은 구현을위한

두 번째 생성자는 어떻게 든 잘못 :

public Book(String t, String a, String p, int y){ 
    Book someBook = new Book(t, a, p, y, MultiLingual m); 
} 
난 그냥 다국어 m 대신 INT의 m를 보낼 수 있지만, 나는 언어의 경우 통제가 없습니다

PL 또는 ENG로 설정됩니다.

그리고 마지막으로 (수) Boook위한 방법은하지만 적어도이 잘 작동해야한다고 생각 :

public String get(int lang){ 

    String data; 
    if (lang == ENG){ 
     data = "Author: "+this.author+"\n"+ 
       "Title: "+this.title+"\n"+ 
       "Publisher: "+this.publisher+"\n"; 
    } 
    else { 
     data = "Autor: "+this.author+"\n"+ 
       "Tytul: "+this.title+"\n"+ 
       "Wydawca: "+this.publisher+"\n";    
    } 

    return data; 
} 

@Override 
public String toString(){ 
    return ""; 
} 

} 

답변

1

인터페이스 내부에서 언어를 나타내는 int는 정적이어야하며, 실수로 코드가 실행되는 동안 코드를 재 작성하기를 원하지는 않습니다. 그런 다음 책 클래스에 언어가 포함 된 int를 보유하게하십시오.

도서 someBook = new Book (t, a, p, y, MultiLingual m); MultiLingual이 인터페이스이기 때문에 작동하지 않습니다. 전달할 인스턴스가있을 수있는 것은 아닙니다.

int 여야합니다. MultiLingual.ENG 또는 .PL과 같은 것입니다

+0

덕분에 이제는 –

2
당신은 아마 더 나은 다른 언어를 표현하기 위해 enum을 사용하는 것

public interface MultiLingual { 

    enum Language { ENG, PL } 

    String get(Language lang); 

} 

클래스 Book 클래스의 생성자는 MultiLingual.Language

public Book(String t, String a, String p, int y, MultiLingual.Language lang) {  
} 
의 인스턴스를 가질 수 있습니다.
+1

언어에 대한 enum 대신에 언어를 나타 내기 위해이 목적을 위해 작성된 Locale 클래스를 사용해야합니다. 이와 같은 많은 도서관은 이미 로케일을 이해하고 있습니다. – Dishayloo

1

ResourceBundle을 사용해 보셨습니까? 즉, 로캘 별 데이터를 정의하는 데 속성 파일을 사용할 수 있으므로 나중에 로캘을 추가하기가 매우 쉽습니다. 데이터 객체는 응용 프로그램에 따라 번역 할 레이블의 일부 키를 반환하므로 ResourceBundle을 통해 올바른 레이블을 확인할 수 있습니다.

+0

+1이되었습니다. 이것이 ResourceBundles의 목적입니다. – duffymo