假设你有一个抽象的类在做一些事情。然后你让抽象的B类做其他的事情。
最后是一些普通的课程,比如说C…Z.
A和B都提供C类使用的功能。Z类。在我的例子中,主要是一个静态的观察者模式,对于某种类型的属性,有些人会得到魔法+延迟加载-这不是静态的。我想把它合并到一个类中,但是我确信它违反了srp:)
所以我把A,B扩展到C,D等…基本上都是C..z类继承了a&b类的功能。所以除了他们应该做的之外,他们还做观察者之类的事情
这是否违反了单一责任原则?

最佳答案

我不知道这是否适用于您的特定情况,但我发现,大多数时候,抽象类和它的实现可以被分成两个普通类。
例如:

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);

这有几个优点:
类之间的耦合不太紧密,因为它们不是相互继承的。因为类是独立的,所以职责更加独立和明确。
您可以使用多个类的功能,而只能从一个抽象类继承。(编辑:显然不在php中,因为您有多个继承)
更清楚的是(imho)在哪个类上调用方法。
似乎您正在使用继承来耦合多个类,但这并不是继承的目的。

10-06 02:40