接口隔离原理用法

Mis*_*tyK 2 c# convention 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;}
Run Code Online (Sandbox Code Playgroud)

而且我想和每个人一起跑.

      foreach(var person in People)
      {
         person.Run();
      }
Run Code Online (Sandbox Code Playgroud)

现在我想和所有人一起吃饭.

          foreach(var person in People)
          {
             person.Eat();
          }
Run Code Online (Sandbox Code Playgroud)

现在,如果我想使用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(){};
    }
Run Code Online (Sandbox Code Playgroud)

我应该怎样列出我的人名单?我应该制作两个Runable和Eatable列表并添加对象(丑陋)或者可能是第二种方法 - 创建一个列表并在可能的情况下投射它们(丑陋)?我不知道这样做的最佳惯例是什么.

这个例子可能不是我能想象的最好的例子,但我希望你知道我的意思.

编辑:我改变了接口和类以及原则名称.

Eri*_*rer 5

如果您的系统中存在运行和吃掉的东西,则将其定义为接口:

public interface IHungryRunner : IRunnable, IEatable
{ }
Run Code Online (Sandbox Code Playgroud)

假设IRunnable和IEatable将永久使用,否则只需将它们保持在一起.

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