これがあなたの特定のケースに当てはまるかどうかはわかりませんが、ほとんどの場合、抽象クラスとその実装は 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)。
継承を使用して複数のクラスを結合しているように見えますが、それは継承の目的ではありません。