首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何分割接口,无论是每个接口有一个操作,还是每个接口分组类似的操作?

如何分割接口,无论是每个接口有一个操作,还是每个接口分组类似的操作?
EN

Stack Overflow用户
提问于 2021-08-15 07:49:47
回答 1查看 104关注 0票数 1

我读过关于依赖反转原理的文章,并看到了下面的例子

有一个名为IBird的接口如下所示

代码语言:javascript
复制
interface IBird
{
    public void Eat();
    public void Walk();
    public void Fly();
}

Pigeon类如下所示,来自接口,鸽子执行所有操作。

代码语言:javascript
复制
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方法将不适用,因为它不能运行。

因此,为解决这一问题,创建了如下接口。

代码语言:javascript
复制
interface IEat { }

interface IWalk { }

interface IFly { }

OstrichPigeon类如下所示:

代码语言:javascript
复制
class Ostrich : IEat, IWalk 
{
}

class Pigeon : IEat, IWalk, IFly
{
}

我有一个澄清如下。

我们能不能按下面的方式来解决这个问题呢?

代码语言:javascript
复制
interface IFlyingBirds
{
    public void Eat();
    public void Walk();
    public void Fly();
}

对于不会飞的鸟类,我创建了一个单独的界面。

代码语言:javascript
复制
interface IFlightlessBirds
{
    public void Eat();
    public void Walk();
}

PigeonOstrich类如下所示:

代码语言:javascript
复制
class Pigeon : IFlyingBirds
{
}

class Ostrich : IFlightlessBirds
{
}

这种方法有什么问题吗?

请对这件事放点光。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-15 11:20:13

这些坚实原则的底线,是使代码更易于理解、易于维护和易于扩展。

每个解决方案都可以工作,但是您的代码将这些行为分成两个不同的接口是否有意义呢?

或者也许创建这些接口会更好:

代码语言:javascript
复制
public interface IBird
{
    public void Eat();
    public void Walk();
}

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

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

请注意,界面偏析原理告诉我们要尽可能多地拆分我们的行为,以便每个实体只按照它所需要的来声明。

这意味着,如果在一个地方您有一个Eagle类,并且您知道您永远不需要对它使用Walk()方法,那么为什么要用它声明它呢?

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

代码语言:javascript
复制
interface IEat
{
}

interface IWalk
{
}

interface IFly
{
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68789647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档