c# - 接口(interface)隔离原则用法

标签 c# convention interface-segregation-principle

这种情况在我身上发生过很多次,我不知道如何解决。

Interface segregation principle是为了防止某些情况,当某些接口(interface)实现不使用它的功能时——这是显而易见的。通常情况下,我有一个接口(interface)列表,我想用它们做一些事情。让我们看一下没有 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 列表并添加对象(丑陋)还是第二种方法 - 创建一个列表并在可能的情况下转换它们(丑陋)?我不知道这样做的最佳约定是什么。

这个例子可能不是我能想象到的最好的例子,但我希望你明白我的意思。

已编辑:我更改了接口(interface)和类以及原理名称。

最佳答案

如果你的系统中有一个东西在运行和吃,那么将它定义为一个接口(interface):

public interface IHungryRunner : IRunnable, IEatable
{ }

假设 IRunnable 和 IEatable 将永远单独使用,否则就将它们放在一起。

您还可以维护单独的 IRunnable 和 IEatable 列表,而不是试图将它们混为一谈。

关于c# - 接口(interface)隔离原则用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24142103/

相关文章:

c# - AsParallel 使 MonoTouch 应用程序崩溃

c# - EntityFramework 5.0 中的基类/实体

ruby-on-rails - 为什么很多人在 Rails 中使用 "-%>"而不是 "%>"?

ruby-on-rails - 模型知道参数哈希 - Rails 反模式?

c# - P/Invoke "Protected Memory"异常/MT或/MD

gradle - 约定优于配置

c# - 接口(interface)隔离和单一职责原则的困境

java - Java 8 中的接口(interface)隔离原则和默认方法

oop - 在 SOLID 中,SRP 和 ISP 有什么区别? (单一职责原则和接口(interface)隔离原则)

c# - 立方体的 WPF 纹理映射