1

次のような少なくとも2つの異なるクラスがあります。

//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/artist) を検出して、入力に基づいて製品オブジェクトの作成を開始するプロデューサー クラスが必要です。

問題 :

上記の2つのクラス間の類似性を集約するためのインターフェースを作成したいので、インターフェースは次のようになります。

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

次に、このインターフェイスをビルダー クラスと上記の 2 つのクラスに実装できますが、これらの異なるメソッドはどうですか?

getVenuFans / getArtistAlbumName / など...?

プロデューサーからそれらを呼び出すにはどうすればよいですか?

これは私のビルダーです:

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...

}
}
4

1 に答える 1

2

オブジェクトを Builder にキャストしているため、これらのメソッドにアクセスすることはできませんが、Builder にはこれらのメソッドがありません。

あなたがやろうとしていることはわかりますが、うまくいかないと思います。たとえば、getVenueFans (会場のことだと思います) は、Venue クラスにのみ適しています。他の非 Venue クラスが実装するインターフェイスにそれを抽象化しようとしても意味がありません。

あなたが持っているものは良いと思います.共通のメソッドをインターフェースに抽象化しました. Venue と Artist でメソッドを呼び出すには、消費するコードでオブジェクトを適切な型にキャストしてから、メソッドを呼び出す必要があります。そして、それはあなたが思うほど悪くはありません。処理している型を知っているのは消費するコードなので (そうでなければ、なぜ getVenueFans を呼び出そうとするのでしょうか?)、そのため、メソッドを直接キャストして呼び出すことが理にかなっています。

于 2012-04-08T22:40:07.367 に答える