请问在C#中,接口这种东西存在的意义是什么呢?

比如interfaceILandBoundintnumoflegs()classhorse:ILandBoundpublicintnumoflegs()return4ma... 比如
interface ILandBound
int numoflegs()
class horse:ILandBound
public int numoflegs()
return 4
main方法
ILandBound landbound=horse
console。writeline(landbound。numoflegs())

这个例子中我完全可以不用接口,而是实例化一个horse的对象H,最后打印H.numoflegs()结果不是一样吗?那么,在C#中,接口这种东西存在的意义是什么呢?
谢谢!
展开
 我来答
makosharp
推荐于2018-05-17 · TA获得超过676个赞
知道小有建树答主
回答量:188
采纳率:100%
帮助的人:270万
展开全部

假定你已了解接口和继承的使用。这里我给你举几个例子从浅入深解释下接口存在的意义。


首先我们从你的例子开始。ILandBound接口可以认为是一种对对象的“描述”,即它声明了“对象(的类型)有陆基特性”,同时它也声明了“陆基对象都可以用numoflegs方法查询其有几条腿”。当然接口是只声明不干活的,它本身只是一个对对象特性的说明。继承了ILandBound接口,则你的类必须实现该接口指明的属性/方法,从逻辑上代表着“我的类表示一种陆基的东东”。这里要指出一点,类本身也是一种对象描述,如同你的horse类,虽然没内容只实现了ILandBound接口,但能够表示“horse类有陆基特性”。


这有什么实际意义呢?举个小例子。还是用ILandBound接口说事。假定你建立了一大堆类,如Donkey、Monkey、Human、Snake、Spider等等,于此同时你有段代码需要获取不管哪种对象(上述5个或更多)的腿的数量,如果你根本不知道对象是什么类型,就只好笨笨的判断了^_^:

int getLegCount(object o)
{
    switch(o.GetType().Name)
    {
        case "Donkey":
            return (o as Donkey).numoflegs();
            break;
        case "Human":
            return (o as Human).numoflegs();
            break;
    }
}

很繁琐吧?其实不仅繁琐,还要求你自己注意Donkey和Human类都必须有int numoflegs()方法,这简直是反人类的做法。


使用ILandBound接口,以上代码就不需要这么写,因为我们的getLegCount方法只想知道”你有几条腿“,而根本不关注”你是什么东东“:


int getLegCount(ILandBound o)
{
    return o.numoflegs();
}

在上面的这个无聊的小例子里,你应该能感性的理解接口是”对一组对象的共有特点的描述“。


再把这个例子改一改。假定上述getLegCount方法在另外一个项目,想要正常使用,这个项目就必须知道上述Donkey等一大堆类型,这会导致一大堆的问题。关于类型,要么引用原项目(会暴露类型),要么自己再写一遍(做跨程序对象类型转换时会被认为两个Donkey类非同一个),总之是很蛋疼的。使用ILandBound接口,你只需要在新项目中添加现有项(IlandBound所在的cs文件),或者各种形式的引用,当真是方便又安全(假设在新项目中,你的应用只关注也只需要关注”有几条腿“,不需要知道”是什么“)。


在这个例子里,更多的展示了接口能够对数据进行”保护“:只拿需要的(接口)数据,不必知道也不用访问对象的类型。


我们可以再想远一点,继承多个接口、多人协作的场景,其实就是上述例子的各种变形。

接口更像是一个行为标准,继承自接口的类型必须符合此标准(属性/方法),访问者也按照标准访问(接口中要求的属性/方法)。在实际操作中,对于接口继承者会稍有额外的工作负担,对于接口访问者会大幅减少工作量。


这里介绍这么多,最后还是要提一点,接口的存在也是因为有*协作*的需要,不管是项目内部协作还是外部协作。如同你的代码,如果除了自己(horse类)没有人需要关注”几条腿“的问题,那么ILandBound接口就是毫无意义的。接口的价值取决于外部访问者的数量,数量为0,价值为0。

网易云信
2023-12-06 广告
信令SDK是一种软件开发工具包,旨在帮助开发者在应用程序中实现信令协议的通信功能。它主要提供了一系列函数、协议和工具,用于处理信令消息的生成、解析、传输和存储等操作。通过使用信令SDK,开发者可以更快速、便捷地实现信令通信功能,提高应用程序... 点击进入详情页
本回答由网易云信提供
斯内科Snake
2014-03-06 · TA获得超过523个赞
知道小有建树答主
回答量:707
采纳率:50%
帮助的人:244万
展开全部
做项目 完全使用类 而不使用interface 确实可以完成项目。但是在多人开发中,使用接口的好处的定义契约与规范,继承于该接口的类必须全部实现这些契约,接口主要用于团队开发。小型项目不推荐使用接口。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
三摩圣地
2019-01-05
知道答主
回答量:1
采纳率:0%
帮助的人:789
展开全部
"接口的存在也是因为有*协作*的需要"-----这个说到重点了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
daniellehan
2014-03-06
知道答主
回答量:27
采纳率:0%
帮助的人:11.2万
展开全部
接口对你写的这个没有意义,并不代表在c#中接口就没有意义了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
UndyingDirge
2014-03-05
知道答主
回答量:15
采纳率:0%
帮助的人:2.1万
展开全部
接口是一种行为规范 定义一类行为方法 只要实现了这个接口的类都可以对接口定义的对象进行热插拔 从设计模式来说 这个就很灵活了
再有就是C#是单继承 但是可以继承多个接口 如同找工作一样 一个人继承了会计接口 那么他就可以去做会计 继承了程序员接口就可以去做程序员 都继承了 就都可以做 但是 要是把这个工作行为定义为类 那么就只能做一个工作
还有就是你多看看设计模式 就明白更多了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式