以前にこの問題について投稿したことがあります (ここ)、これは解決策への別のアプローチです。この解決策は、明示的にアップキャストする必要がなくなるため、クラスを実装する人々の動作をより適切にカプセル化するようです。
問題は次のとおりです。
派生オブジェクトを介して追加の動作を提供しながら、ほとんどのオブジェクトでコア動作を分離したいプロジェクトがあります。簡単です:
class BaseA
{
virtual void something() {}
}
class DerivedA : public BaseA
{
void something() {}
void somethingElse() {}
}
ここで、上記のクラスを集約することを除いて同じ継承スキームの 2 番目のクラス セットもあるとします。ただし、基本バージョンは基本クラスを使用し、派生バージョンは派生クラスで使用したいと考えています。私の解決策は、同じ名前を使用して基本クラス変数を「隠す」ことを考えていました。
class BaseB
{
BaseA *var;
BaseB()
{
var = new BaseA();
}
virtual void anotherThing1();
virtual void anotherThing2();
virtual void anotherThing3();
}
class DerivedB : public BaseB
{
DerivedA *var;
DerivedB()
{
var = new DerivedA();
}
void anotherThing1();
void anotherThing2();
void anotherThing3();
void andAnother1();
void andAnother2();
}
このアプローチの目標は、派生した集約クラスに依存する関数が、取得した機能を実現するために明示的にキャストする必要がなくなるようにすることです。
void func1( BaseB &b )
{
b.anotherThing1();
b.var->something();
}
void func2( DerivedB &b )
{
b.anotherThing1();
b.andAnother1();
b.var->something();
b.var->somethingElse();
}
void main( int argc, char **argv )
{
BaseB baseB;
DerivedB derivedB;
func1( baseB );
func1( derivedB );
func2( derivedB );
}
これは悪い習慣と見なされますか?