【发布时间】:2014-06-10 13:19:15
【问题描述】:
这种情况发生在我身上很多次,我不知道如何解决。
Interface segregation principle 是为了防止出现某些接口实现不使用它的功能的情况——这很明显。经常有这样的情况,我有一个接口列表,我想用它们做点什么。让我们看看没有 ISP 的例子:
public interface IPerson
{
void Run();
void Eat();
}
public class AbcPerson : IPerson
{
void Run(){};
void Eat(){};
}
public class XyzPerson : IPerson
{
void Run(){};
void Eat(){};
}
List<IPerson> People {get;set;}
我想和每个人一起跑步。
foreach(var person in People)
{
person.Run();
}
现在我想和他们一起吃饭。
foreach(var person in People)
{
person.Eat();
}
现在如果我想使用 ISP,我应该将代码更改为:
public interface IRunnable
{
void Run();
}
public interface IEatable
{
void Eat();
}
public class AbcPerson : IRunnable,IEatable
{
void Run(){};
void Eat(){};
}
public class XyzPerson : IRunnable,IEatable
{
void Run(){};
void Eat(){};
}
我应该如何制作我的人员名单?我应该制作两个 Runable 和 Eatable 列表并添加对象(丑陋)还是第二种方法 - 创建一个列表并在可能的情况下投射它们(丑陋)?我不知道这样做的最佳惯例是什么。
这个例子可能不是我能想象的最好的例子,但我希望你明白我的意思。
已编辑:我更改了接口和类以及原理名称。
【问题讨论】:
-
我不认为在同一个界面中有
Connect和Disconnect违反了SRP。您应该将您的界面描述为比IConnect更通用的东西,也许可以描述您的产品,例如IDevice,它们可以一起生活 -
是的,这就是为什么我写它不是一个完美的例子。它应该是不同的东西,比如 Eat() 和 Run(),我会编辑它
-
SRP 是“做一件事”的原则,这里我并没有真正看到与接口的链接。它也与 ISP 没有真正的关系,因为您正在使用所有方法。我会说这更像是一个 OCP 案例,但这实际上取决于系统稍后会如何改变,我们不知道。
-
是的,你完全正确。我拼错了名字。我的意思是接口隔离原则
-
您可以添加第三个接口来继承两者。
标签: c# convention interface-segregation-principle