请问在C#中,接口这种东西存在的意义是什么呢?
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#中,接口这种东西存在的意义是什么呢?
谢谢! 展开
假定你已了解接口和继承的使用。这里我给你举几个例子从浅入深解释下接口存在的意义。
首先我们从你的例子开始。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。
2024-05-14 广告
再有就是C#是单继承 但是可以继承多个接口 如同找工作一样 一个人继承了会计接口 那么他就可以去做会计 继承了程序员接口就可以去做程序员 都继承了 就都可以做 但是 要是把这个工作行为定义为类 那么就只能做一个工作
还有就是你多看看设计模式 就明白更多了
广告 您可能关注的内容 |