假设您有抽象的A类做某些事情。然后你有抽象的B级做其他事情。
最后是一些正常的课程,比方说C ...... Z。
A和B都提供C类...... Z类使用的功能。在我的例子中,主要是一个静态的观察者模式,以及某种类型的属性的一些__get魔术+延迟加载 - 这不是静态的。我想把它合并成一个类,但是我确定它违反了SRP:)
所以我在C,D等中扩展A,B ......基本上所有C .. Z类都继承了A& A的功能。 B班。除了他们应该做的事情之外,他们还会做观察者的事情等等
这是否违反了单一责任原则?
答案 0 :(得分:3)
我读到这个“多重继承是否违反了SRP”?
从技术上讲,我会说是。
实际上,它更模糊。什么是“责任”?您可能需要两部分功能来满足复合责任。您还必须平衡与实施和维护对象层次结构严格性相关的工作量。
这是一个原则。它的存在是为了集中思考封装和分离关注点,以避免将所有内容都抛到凌乱的“一刀切”的超类中。
现在举一个具体的例子:你是否为了方便而拉入A和B?如果你看看A和B的不同消费者需要什么,是否有一些重构试图突破(例如某些不需要或应该在其他地方完成的功能子集?)在摘要中,这是不可能的。
答案 1 :(得分:3)
我不知道这是否适用于您的具体案例,但我发现大部分时间,抽象类及其实现可以分为两个普通类。
例如:
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);
这有几个好处:
看起来你正在使用继承来连接多个类,但这不是继承的意思。
答案 2 :(得分:0)
多重继承不会强迫这一点,但往往导致它。您的基本接口是为单一目的而设计的,继承这两个接口确实创建了一个具有多个职责的类。 您可以将类和接口划分为两个主要组 - 解决系统基本复杂性的组,以及解决其意外复杂性的组。我想如果你继承了多个"必要的"上课,很糟糕。但如果你继承了一个"必要的"和一个或多个"意外"上课,这是正常的。