我有一个从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?
答案 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(){...}
}
鸟可以飞行和行走。
也许这个例子不完全符合您的情况。但我想说的是,如果两个职责分别用基础中的一个和派生的另一个职责分开,那么派生类将获得两个职责。