3

抽象クラス A が何らかの処理を行っているとしましょう。次に、抽象クラス B が他のことを行います。

そして最後にいくつかの通常のクラス、たとえば C ... Z としましょう。

A と B の両方が、クラス C .. Z クラスで使用される機能を提供します。私の場合、主に静的なオブザーバー パターンと、一部の __get マジック + 特定のタイプのプロパティの遅延読み込み - これは静的ではありません。これを1つのクラスにマージすることを考えていますが、SRPに違反していると確信しています:)

したがって、私はA、BをC、Dなどに拡張しています...基本的にすべてのC .. Zクラスは、AおよびBクラスの機能を継承しています。したがって、彼らがすべきことのほかに、オブザーバーのことなども行います。

これは単一責任の原則に違反していますか?

4

3 に答える 3

3

これを「多重継承は SRP に違反しますか」と読みましたか?

技術的には、そうです。

実際には、それはもっとあいまいです。「責任」とは何ですか?複合責任を満たすために、機能の両方の部分が必要になる可能性があります。また、オブジェクト階層に課す厳格さの実装と維持に関連する労力のバランスを取る必要もあります。

それは原則です。これは、カプセル化と懸念の分離に関する考え方に焦点を当て、すべてを乱雑な画一的なスーパークラスに放り込もうとするのを避けるために存在します。

具体的な例として、便宜上 A と B を引き込んでいますか? A と B のさまざまなコンシューマーが何を必要としているのかを見ると、解決しようとしているリファクタリングがありますか (たとえば、必要のない、または他の場所で実行する必要がある機能のサブセットですか?) 抽象的に言うことは不可能です。

于 2012-08-24T13:00:44.440 に答える
3

これがあなたの特定のケースに当てはまるかどうかはわかりませんが、ほとんどの場合、抽象クラスとその実装は 2 つの通常のクラスに分割できることがわかりました。

例えば:

abstract class AbstractAdder {
    int AddThree(int a) {
        Add(a, 3);
    }

    abstract int Add(int a, int b);
}

class NormalAdder inherits AbstractAdder {
    int Add(int a, int b) {
        return a + b;
    }
}

var result = new NormalAdder().AddThree(6);

次のように変更できます。

class ThreeAdder {
    ThreeAdder(IGenericAdder genericAdder) {
        this.genericAdder = genericAdder;
    }

    int AddThree(int a) {
        return this.genericAdder.Add(a, 3);
    }
}

class NormalAdder implements IGenericAdder {
    int Add(int a, int b) {
        return a + b;
    }
}

var result = new ThreeAdder(new NormalAdder()).AddThree(6);

これにはいくつかの利点があります。

  • クラスは相互に継承されないため、緊密に結合されていません。クラスが分離されているため、責任はより分離され、明確に定義されています。
  • 複数のクラスの機能を使用できますが、継承できる抽象クラスは 1 つだけです。(編集:複数の継承があるため、明らかにPHPにはありません)
  • メソッドがどのクラスで呼び出されるかは明確です(IMHO)。

継承を使用して複数のクラスを結合しているように見えますが、それは継承の目的ではありません。

于 2012-08-24T13:02:13.633 に答える
0

多重継承はこれを強制しませんが、それにつながる傾向があります。基本インターフェースは単一の目的のために設計されており、両方を継承すると、複数の責任を持つクラスが作成されます。クラスとインターフェースを 2 つの主要なグループに分割できます。システムの本質的な複雑さに対処するグループと、システムの偶発的な複雑さに対処するグループです。複数の「必須」クラスから継承するのは悪いことだと思います。ただし、1 つの「必須」クラスと 1 つ以上の「偶発的」クラスから継承する場合、それは正常です。

于 2017-11-16T05:38:45.950 に答える