前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >接口(interface)

接口(interface)

作者头像
宿春磊Charles
发布2022-03-29 10:17:14
3030
发布2022-03-29 10:17:14
举报
文章被收录于专栏:DotNet 致知

这节讲一下接口(interface) 。

接口是一种特殊的抽象类,它用来定义一组行为规范,不同于抽象类的是,接口只能定义方法,并且只能定义抽象方法。类用继承来描述子类和父类之间的关系,而接口用实现来描述接口和类的关系。

代码语言:javascript
复制
interface IAnimal
{
    void Shout ();
}

接口有个约定俗成的命名规则,所有接口的首字母都是I,接口中的方法都必须是public,所以定义接口中的方法时可以省略此关键字。

接口本身的语法很简单,但是接口在整个面向对象中的作用是举足轻重的,一般接口作为服务的调用者,其子类作为服务的提供者,可以让我们实现更松的耦合。跟接口有关的有一个很重要的原则:接口隔离原则(Interface Segregation Principle),它跟类的单一职责原则类似,它强调接口定义的方法,要从属于同一类。

我们看一个不太恰当例子:

代码语言:javascript
复制
interface IDonaldDuck
{
    void Say ();
    void Swim ();
}

class DonalDuck : IDonaldDuck
{
    public void Say ()
    {
        Console.WriteLine ("没有小鸭子比我更懂说话。");
    }

    public void Swim ()
    {
        Console.WriteLine ("没有小鸭子比我更懂游泳。");
    }
}

唐老鸭继承了IDonalDuck接口,接口定义了说话和浮水这两个方法,说话是人的特有的行为,浮水是鸭科动物等的行为,这两种行为的从属不一样,所以根据接口隔离原则来说,我们不能将其放在一块,而是应该像下面这样:

代码语言:javascript
复制
interface IPreson
{
    void Say ();
}
interface IDuck
{
    void Swim ();
}

class DonalDuck : IPreson,IDuck
{
    public void Say ()
    {
        Console.WriteLine ("没有小鸭子比我更懂说话。");
    }

    public void Swim ()
    {
        Console.WriteLine ("没有小鸭子比我更懂游泳。");
    }
}

根据行为的从属性质不同,划分合理的接口,但是要注意,我们在开发的时候,不要将接口分的过细,要取一个度,合适的遵循接口隔离原则。

另外,我们还可以显示的实现接口,还是以上面的例子来说:

代码语言:javascript
复制
class DonalDuck : IPreson, IDuck
{
    void IPreson.Say ()
    {
        throw new NotImplementedException ();
    }

    void IDuck.Swim ()
    {
        throw new NotImplementedException ();
    }
}

在方法的名字前加上接口名,这样,在实例化类的时候,我们只有在将类的实例赋给它的实现接口时,才能使用该类实现的该接口的方法。

直接实例,是无法看到实现的接口方法的:

我们需要显示的赋给接口类才能看到对应的方法:

本节到此结束...

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet 致知 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档