基类有一个责任,派生类有另一个责任。这是否符合SRP?

时间:2016-04-18 07:06:14

标签: design-principles

我有一个从ButtonModifier派生的VolumeButton。如果我将业务逻辑(音量增大/减小,静音等)放入VolumeButton,则启用/禁用基类ButtonModifier的逻辑。像,

public class VolumeButton : ButtonModifier
{
    /// Event handler to change the volume.
    void ChangeVolume() { ... }
}

public class ButtonModifier
{
    /// Updates the visibility of the button.
    void UpdateVolumeVisibleStatus() { ... }

    /// Enable or disable the button.
    void Enable(bool enable) { ... }
}

一方面,只有业务逻辑更改会影响VolumeButton,而基础架构更改会影响ButtonModifier。所以它符合SRP。另一方面,VolumeButton从基类继承了启用/禁用逻辑。那么它有两个职责?

这两个类是否符合SRP?

2 个答案:

答案 0 :(得分:0)

VolumeButton和ButtonModifier只有一个原因可以单独更改。所以他们完全符合SRP。但是,直觉上我认为VolumeButton继承了ButtonModifie的职责,导致它违反了SRP。

从代码依赖性的角度来看,您没有通过将一个职责从派生类移动到基类来解耦任何依赖关系。根据鲍勃的叔叔"敏捷原则,C#中的模式和实践" Chapter 8,在所有的例子中,鲍勃叔叔引入了额外的抽象来分离责任。因此,对您的问题提供一个有用的提示可能是"您是否引入了额外的抽象来解耦依赖关系?"

答案 1 :(得分:0)

我认为它们不符合SRP,因为派生类从其基类获取所有公共/受保护成员,例如:

public class Flyable
{
    public void fly(){...}
}
public class Bird : Flyable
{
    public void walk(){...}
}
鸟可以飞行和行走。 也许这个例子不完全符合您的情况。但我想说的是,如果两个职责分别用基础中的一个和派生的另一个职责分开,那么派生类将获得两个职责。