2012-04-08 2 views
1

나는 다음과 같이 두 개 이상의 다른 클래스가 있습니다다른 객체에 대한 인터페이스를 빌더 설계 패턴에서 사용하도록 설계하는 방법은 무엇입니까?

//NOTE : these two classes have getter and setter also 
class Artist { 

String artistName; 
String artistWebsite; 
String artistDbpedia; 
String artistImage; 
List<String> astistAlbumsName; 
List<String> astistAlbumsUrl; 
} 

class Venu { 
String VenuName; 
String VenuWebsite; 
String VenuDbpdia; 
String VenuImage; 
String VenuDescription; 
List<String> venuFans; 
} 

내가 입력으로 XML 파일을 얻을 및 XML (venu/작가)의 유형을 감지하는 프로듀서 클래스를 갖고 싶어 다음을 만들 시작 입력을 기반으로 한 제품 오브젝트.

문제 :

내 인터페이스가 될 수 있도록 집계를 위해 위의 두 클래스 사이의 유사성을 인터페이스를 만들려면 :

interface Model { 
public String getImage(); 
public String getName(); 
public String getWebsite(); 
public String getdbpedia(); 
} 

그럼 내가 위에서 내 빌더 클래스에서이 인터페이스를 구현하고 있습니다 두 가지 클래스가 있지만 그 다른 메소드는 어떨까요?

getVenuFans/getArtistAlbumName/etc ....?

제작자로부터 어떻게 호출 할 수 있습니까?

내 빌더 :

Class Builder implements Model { 
public String getImage(){} 
public String getName(){} 
public String getWebsite(){} 
public String getdbpedia(){} 
} 

이 내 생산자가 될 수 있습니다

Class Producer { 
public Producer() 
{ 
Builder b = null; 
//assume Venu and Artist implements Model 
b = (Builder) new Venu(); 
//I don't have access to getVenuFans()! 

b = (Builder) new Artist(); 
//I don't have access to getArtistAlbumsName()/etc... 

} 
} 

답변

2

당신이 빌더에 개체를 캐스팅하고 있기 때문에 당신은 그 방법에 액세스 할 수 없습니다 Builder에는 이러한 메소드가 없습니다.

나는 당신이하려는 것을보고 있지만 그것이 효과가 있다고 생각하지 않습니다. 예를 들어, getVenueFans (저는 여러분이 회장을 의미한다고 가정합니다)은 Venue 클래스에만 적합합니다. 그것을 다른 비 Venue 클래스가 구현할 인터페이스로 추상화하려고 시도하는 것은 이치에 맞지 않습니다.

나는 당신이 가진 것이 좋다고 생각한다 : 일반적인 방법을 인터페이스로 추상화했다. 장소와 아티스트의 메소드를 호출하려면, 소비 코드가 객체를 적절한 유형으로 형변환 한 다음 그 객체의 메소드를 호출해야합니다. 그리고 생각만큼 나쁜 것은 아닙니다. 이 어떤 유형인지 알고 있습니다 (그렇지 않은 경우 왜 getVenueFans를 호출하려고합니까?). 따라서이 메소드는 직접 캐스팅하고 메서드를 직접 호출하는 것이 좋습니다.

관련 문제