3

假设您有抽象类 A 做一些事情。然后你让抽象类 B 做其他事情。

最后是一些普通的课程,比如说 C ... Z。

A 和 B 都提供 C .. Z 类使用的功能。在我的情况下,主要是一个静态的观察者模式,以及某些类型的属性的一些 __get 魔术 + 延迟加载 - 这不是静态的。我正在考虑将其合并到一个类中,但我确信它违反了 SRP :)

所以我在 C、D 等中扩展了 A、B... 基本上所有 C .. Z 类都继承了 A 和 B 类的功能。所以除了他们应该做的事情之外,他们还做观察者的事情等等

这是否违反单一责任原则?

4

3 回答 3

3

我将其读作“多重继承是否违反了 SRP”?

从技术上讲,我会说是的。

实际上,它更加模糊。什么是“责任”?您可能需要这两个部分的功能来满足复合责任。您还必须平衡与实施和维护您对对象层次结构施加的严格性相关的努力。

这是一个原则。它的存在是为了将您的思考集中在关注点的封装和分离上,以免试图将所有东西都扔进一刀切的凌乱的超类中。

现在来看一个具体的例子:为了方便起见,你是在拉 A 和 B 吗?如果您查看 A 和 B 的不同消费者需要什么,是否有一些试图突破的重构(例如,不需要或应该在其他地方完成的某些功能子集?)在抽象中不可能说。

于 2012-08-24T13:00:44.440 回答
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);

这有几个优点:

  • 这些类的耦合度较低,因为它们不会相互继承。因为类是独立的,所以职责更加独立和明确。
  • 您可以使用多个类的功能,而您只能从一个抽象类继承。(编辑:显然不是在 PHP 中,因为你有多重继承)
  • 在哪个类上调用该方法更清楚(恕我直言)。

似乎您正在使用继承来耦合多个类,但这不是继承的意思。

于 2012-08-24T13:02:13.633 回答
0

多重继承不会强制这样做,但往往会导致它。您的基本接口是为单一目的而设计的,继承它们确实会创建一个具有多种职责的类。您可以将您的类和接口分为两大类——一类解决系统的基本复杂性,另一类解决其偶然的复杂性。我认为如果你从多个“基本”类继承,那就不好了。但是如果你从一个“基本”类和一个或多个“偶然”类继承,这是正常的。

于 2017-11-16T05:38:45.950 回答