抽象クラスを作った際にインタフェースが増えすぎる
例えば図形クラスという親クラスがいて、その下に三角形、四角形、円形、楕円形、星型、等の具体的な子クラスがいるとします。今ファクトリーパターンで図形を生成しているのですが、それぞれの図形が持つ初期値をどう設定しようか迷っています。
例えば四角形はx, y, width, heightが必要ですが、円形ではcenterX, centerY, radiusが必要になります。今の私の設計では、それぞれのインタフェースを用意しているのですが、図形が増えるたびに、そのインタフェースが増え、ある図形専用の関数(下の例だとcreate)が増えてしまいます。
こういった場合にはどのように対処するのが良いのでしょうか?初期化のパラメタを抽象化すれば良いような気がしますが、具体的な解決策が思い浮かびません。
//!< main.cpp
enum ZUKEI {
SHIKAKU=0,
EN = 1.
SANKAKU = 2,
…
}
Zukei* sankaku = zukeiFactory.create(SHIKAKU, x, y, width, height);
Zukei* shikaku = zukeiFactory.create(EN, centerX, centerY, radius);
//!< ZukeiFactory.cpp
Zukei* ZukeiFactory::create(int zukeiId, int x, int y, int width, int height){
switch(zukeiId) {
case SHIKAKU:
return new ShikakuZukei(x, y, width, height);
case EN:
//???return new EnZukei();
}
}
Zukei* ZukeiFactory::create(int zukeiId, int centerX, int centerY, int radius) {
switch(zukeiId) {
case SHIKAKU:
//???return new ShikakuZukei();
case EN:
return new EnZukei(centerX, centerY, radius);
}
}
宜しくお願いします。
補足
アドバイスありがとうございます。 なるほどですね。使える人が使うには便利そうですね。 それぞれの部、課のインターフェイスがあれば、 それを継承して使っていくのですかね。 なんとなくですが実用的なイメージがつかめてきたと思います。 ありがとうございました。