如何拆分接口是每个接口有一个操作还是每个接口对类似操作进行分组?

How to split interfaces whether to have one action per interface or grouping similar actions per interface?

我阅读了依赖倒置原则并看到了如下示例

有一个名为IBird的界面如下

interface IBird
{
    public void Eat();
    public void Walk();
    public void Fly();
}

Pigeon class 派生如下界面,鸽子做所有动作。

class Pigeon : IBird
{
    public void Eat()
    {
        Console.WriteLine("Pigeon can eat");
    }

    public void Walk()
    {
        Console.WriteLine("Pigeon can walk");
    }

    public void Fly()
    {
        Console.WriteLine("Pigeon can fly");
    }
}

当我导出Ostrich时,Fly方法将不适用,因为它不能飞。

因此创建了如下接口来解决这个问题。

interface IEat { }

interface IWalk { }

interface IFly { }

OstrichPigeon classes 将派生如下:

class Ostrich : IEat, IWalk 
{
}

class Pigeon : IEat, IWalk, IFly
{
}

我有一个澄清如下。

我们能否制作如下界面来解决这个问题。

interface IFlyingBirds
{
    public void Eat();
    public void Walk();
    public void Fly();
}

我为不会飞的鸟创建了一个单独的界面。

interface IFlightlessBirds
{
    public void Eat();
    public void Walk();
}

PigeonOstrich classes 将派生如下:

class Pigeon : IFlyingBirds
{
}

class Ostrich : IFlightlessBirds
{
}

这个方法有问题吗?

请说明一下。

这些 SOLID 原则的底线是使代码更易于理解、易于维护且易于扩展。

每个解决方案都可行,但想一想,将这些行为拆分为两个不同的接口对您的代码有意义吗?

或者创建这些接口可能会更好:

public interface IBird
{
    public void Eat();
    public void Walk();
}

public interface IFlyingBird : IBird
{
    public void Fly();
}

任何对您的代码更有意义的东西。

请注意,interface segregation principle 告诉我们尽可能地拆分我们的行为,以便每个实体只声明它需要的内容。

意思是如果在一个地方你有一个 Eagle class 并且你知道你永远不必为它使用 Walk() 方法,那么你为什么要用它声明它?

在这种情况下,这些声明更合理:

interface IEat
{
}

interface IWalk
{
}

interface IFly
{
}