要するに、クラスインスタンスを特定のインタフェースを実装していないスーパークラスでグループ化できるようにしたいと思います。しかし、インスタンスのセットから、そのインターフェイスを実装するインスタンスのインターフェイスからメソッドを呼びたいと思います。インタフェースへのオブジェクトダウンキャスト
説明できるコード例をいくつか示します。
class Building{
String c = "white";
Building(){
}
void printColor(){
println("The building is " + c);
}
void paint(String c){
this.c = c;
}
void printBuildQuality(){
println("The build quality is average");
}
}
class SturdyFactoryBuilding extends Building implements Factory{
SturdyFactoryBuilding(){
super();
}
void printBuildQuality(){
println("The build quality is sturdy");
}
void printFactoryOutput(){
println("This factory makes stuff");
}
}
class ShakyFactoryBuilding extends Building implements Factory{
ShakyFactoryBuilding(){
super();
}
void printBuildQuality(){
println("The build quality is shaky");
}
void printFactoryOutput(){
println("This factory makes slightly different stuff");
}
}
public interface Factory{
public void printFactoryOutput();
}
Building building = new SturdyFactoryBuilding();
building.printBuildQuality();
building.printColor();
building.paint("bright red");
building.printColor();
building.printFactoryOutput();
スーパークラスに 'isFactory'フラグが設定されている可能性があります。
ありがとうございました。
私はあなたがトレードオフをしなければならないと思う
単純な 'if(Factory instanceof Factory)'チェックで実現できます。しかし、あなたがしようとしていることは良いデザインとは考えられません。 – Kayaman
私は@ Kayamanを見ていますので、このようにしてください: 'if(building instanceof Factory){ SturdyFactoryBuilding sfb =(SturdyFactoryBuilding)building; sfb.printFactoryOutput(); } '特定のサブクラスにダウンキャストする必要があるので、どうすればよいデザインにならないのか分かります。これについてもっと良い方法がありますか? – Bluefarmer
'printFactoryOutput'を' Building'に追加して、NOOPのデフォルト実装を与えることができます。ファクトリはデフォルトをオーバーライドします。アダプターの種類 - アプローチ。 – Fildor