web-dev-qa-db-ja.com

部分的に実装されたインターフェースの使用

C++表記で次の階層を検討してください。

class A
    {
    public:
        virtual void doStuff()=0;
        virtual void doOtherStuff()=0;
    };

class B:public A
    {
    public:
        void doStuff();
        void doOtherStuff();
    };

class C:public A
    {
    public:
        void doStuff();
        void doOtherStuff();
    };

ここで、doStuffのコードがBとCで同一であると仮定します。のベストプラクティスは何ですか

  • クラスD:public AにdoStuffを実装し、BとCをAから派生させます
  • BとCの両方でdoStuffから呼び出される関数で実際のタスクを実行しましょう

どういうわけか後者の方がきれいに見えますね。 BとCには、一般的な実装を持つ他のメソッドもあり、基礎となるモデルにはDの概念が存在しないことに注意してください。

2
user877329

DoStuffの共有実装を保持するクラスEを作成します

class E : class A
{
override doStuff() {}
}

クラスBとCがEから継承するようにします。これにより、BとCがAから派生したタイプである必要がある場合でも継承を維持できますが、Aと他の派生は同じ実装とBとCを共有できません。

1
Kevin