|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你觉得学习.NET怎么样,我懂的少,问的可能很幼稚,见笑了啊:)系列文章目次索引:《你必需晓得的.NET》
本文将先容以下内容:
•面向对象头脑:多态
•接口
•笼统类
1.弁言
在我之前的一篇post《笼统类和接口的谁是谁非》中,和同事管伟的会商,失掉良多伴侣的存眷,由于是不成系统的论道,以是给人人懂得形成方便,同时关于这个主题的体系性实际,我以为也有需要做以总结,因而才有了本篇的奇怪出炉。同时,我将把上贴中的成绩特地也在此做以交卸。
2.观点引进
接口是包括一组虚办法的笼统范例,个中每种办法都有其称号、参数和前往值。接口办法不克不及包括任何完成,CLR同意接口能够包括事务、属性、索引器、静态办法、静态字段、静态机关函数和常数。可是注重:C#中不克不及包括任何静态成员。一个类能够完成多个接口,当一个类承继某个接口时,它不但要完成该接口界说的一切办法,还要完成该接口从其他接口中承继的一切办法。
界说办法为:
publicinterfaceSystem.IComparable
{
intCompareTo(objecto);
}
publicclassTestCls:IComparable
{
publicTestCls()
{
}
privateint_value;
publicintValue
{
get{return_value;}
set{_value=value;}
}
publicintCompareTo(objecto)
{
//利用as形式举行转型判别
TestClsaCls=oasTestCls;
if(aCls!=null)
{
//完成笼统办法
return_value.CompareTo(aCls._value);
}
}
}
笼统类供应多个派生类共享基类的大众界说,它既能够供应笼统办法,也能够供应非笼统办法。笼统类不克不及实例化,必需经由过程承继由派生类完成其笼统办法,因而对笼统类不克不及利用new关头字,也不克不及被密封。假如派生类没有完成一切的笼统办法,则该派生类也必需声明为笼统类。别的,完成笼统办法由overriding办法来完成。
界说办法为:
///<summary>
///界说笼统类
///</summary>
abstractpublicclassAnimal
{
//界说静态字段
protectedint_id;
//界说属性
publicabstractintId
{
get;
set;
}
//界说办法
publicabstractvoidEat();
//界说索引器
publicstringthis[inti]
{
get;
set;
}
}
///<summary>
///完成笼统类
///</summary>
publicclassDog:Animal
{
publicoverrideintId
{
get{return_id;}
set{_id=value;}
}
publicoverridevoidEat()
{
Console.Write("DogEats.")
}
}
3.不异点和分歧点
3.1不异点
- 都不克不及被间接实例化,都能够经由过程承继完成其笼统办法。
- 都是面向笼统编程的手艺基本,完成了诸多的计划形式。
3.2分歧点
- 接口撑持多承继;笼统类不克不及完成多承继。
- 接口只能界说笼统划定规矩;笼统类既能够界说划定规矩,还大概供应已完成的成员。
- 接口是一组举动标准;笼统类是一个不完整的类,侧重族的观点。
- 接口能够用于撑持回调;笼统类不克不及完成回调,由于承继不撑持。
- 接口只包括办法、属性、索引器、事务的署名,但不克不及界说字段和包括完成的办法;笼统类能够界说字段、属性、包括有完成的办法。
- 接口能够感化于值范例和援用范例;笼统类只能感化于援用范例。比方,Struct就能够承继接口,而不克不及承继类。
经由过程不异与分歧的对照,我们只能说接口和笼统类,各有所长,但无优略。在实践的编程理论中,我们要视详细情形来酌情量才,可是以下的履历和堆集,也许能给人人一些启发,除我的一些堆集以外,良多都来历于典范,我信任经得起磨练。以是在划定规矩与场所中,我们进修这些典范,最主要的是学乃至用,固然我将以一家之言广博家之笑,看官请持续。
3.3划定规矩与场所
- 请记着,面向对象头脑的一个最主要的准绳就是:面向接口编程。
- 借助接口和笼统类,23个计划形式中的良多头脑被奇妙的完成了,我以为其精华复杂说来就是:面向笼统编程。
- 笼统类应次要用于干系亲切的对象,而接口最合适为不相干的类供应通勤奋能。
- 接口侧重于CAN-DO干系范例,而笼统类则侧重于IS-A式的干系;
- 接口多界说对象的举动;笼统类多界说对象的属性;
- 接口界说可使用public、protected、internal和private润色符,可是几近一切的接口都界说为public,缘故原由就不用多说了。
- “接口稳定”,是应当思索的主要要素。以是,在由接口增添扩大时,应当增添新的接口,而不克不及变动现有接口。
- 只管将接口计划乐成能单一的功效块,以.NETFramework为例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只包括一个大众办法。
- 接口称号后面的年夜写字母“I”是一个商定,正如字段名以下划线开首一样,请保持这些准绳。
- 在接口中,一切的办法都默许为public。
- 假如估计会呈现版本成绩,能够创立“笼统类”。比方,创立了狗(Dog)、鸡(Chicken)和鸭(Duck),那末应当思索笼统出植物(Animal)来应对今后大概呈现风马牛的事变。而向接口中增加新成员则会强迫请求修正一切派生类,偏重新编译,以是版本式的成绩最好以笼统类来完成。
- 从笼统类派生的非笼统类必需包含承继的一切笼统办法和笼统会见器的实完成。
- 对笼统类不克不及利用new关头字,也不克不及被密封,缘故原由是笼统类不克不及被实例化。
- 在笼统办法声明中不克不及利用static或virtual润色符。
以上的划定规矩,我就恬不知耻的暂定为T14条吧,写的这么累,就当一时的夸奖吧。人人也能够互通有没有,我将实时订正。
4.典范示例
4.1相对典范
.NETFramework是进修的最好资本,无意识的研讨FCL是每一个.NET程序员的?课,关于接口和笼统类在FCL中的利用,我有以下的倡议:
- FCL对汇合类利用了基于接口的计划,以是请存眷System.Collections中关于接口的计划完成;
- FCL对数据流相干类利用了基于笼统类的计划,以是请存眷System.IO.Stream类的笼统类计划机制。
4.2别样小菜
上面的实例,由于是我的了解,因而给典范打上“绝对”的暗号,至于甚么时分提升为“相对”,就看我在.NET寻求的路上,是不是可以自始自终的云云固执,因而我将把绝对重构到相对为止(呵呵)。本示例没有论述笼统类和接口在计划形式中的使用,由于那将是另外一篇有会商代价的文本,本文着眼与观点和准绳的掌控,可是真实的使用来自于详细的需求标准。
计划布局如图所示:
<br>
1.界说笼统类
publicabstractclassAnimal
{
protectedstring_name;
//声明笼统属性
publicabstractstringName
{
get;
}
//声明笼统办法
publicabstractvoidShow();
//完成一样平常办法
publicvoidMakeVoice()
{
Console.WriteLine("Allanimalscanmakevoice!");
}
}
2.界说接口
publicinterfaceIAction
{
//界说大众办法标签
voidMove();
}
3.完成笼统类和接口
publicclassDuck:Animal,IAction
{
publicDuck(stringname)
{
_name=name;
}
//重载笼统办法
publicoverridevoidShow()
{
Console.WriteLine(_name+"isshowingforyou.");
}
//重载笼统属性
publicoverridestringName
{
get{return_name;}
}
//完成接口办法
publicvoidMove()
{
Console.WriteLine("Duckalsocanswim.");
}
}
publicclassDog:Animal,IAction
{
publicDog(stringname)
{
_name=name;
}
publicoverridevoidShow()
{
Console.WriteLine(_name+"isshowingforyou.");
}
publicoverridestringName
{
get{return_name;}
}
publicvoidMove()
{
Console.WriteLine(_name+"alsocanrun.");
}
}
4.客户端完成
publicclassTestAnmial
{
publicstaticvoidMain(string[]args)
{
Animalduck=newDuck("Duck");
duck.MakeVoice();
duck.Show();
Animaldog=newDog("Dog");
dog.MakeVoice();
dog.Show();
IActiondogAction=newDog("Abigdog");
dogAction.Move();
}
}
5.参考之资
正所谓真谛是人人看出来的,以是将园子里有立异性的概念潜列于此,一是感激人人的共享,二是完美一家之言的不敷,但愿可以将范畴构成常识,受用于我,受用于众。
- dunai以为:笼统类是提取详细类的公因式,而接口是为了将一些不相干的类“杂凑”成一个配合的群体。至于他们在各个言语中的句法,言语细节并非我体贴的重点。
- 桦山涧的保藏也很不错。
- Artech以为:所代码共用和可扩大性思索,只管利用AbstractClass。固然接口在其他方面的上风,我以为也不成无视。
- shenfx以为:当在差别较年夜的对象间追求功效上的个性时,利用接口;当在个性较多的对象间追求功效上的差别时,利用笼统基类。
最初,MSDN的倡议是:
- 假如估计要创立组件的多个版本,则创立笼统类。笼统类供应复杂易行的办法来把持组件版本。经由过程更新基类,一切承继类都随变动主动更新。另外一方面,接口一旦创立就不克不及变动。假如必要接口的新版本,必需创立一个全新的接口。
- 假如创立的功效将在年夜局限的全异对象间利用,则利用接口。笼统类应次要用于干系亲切的对象,而接口最合适为不相干的类供应通勤奋能。
- 假如要计划小而简洁的功效块,则利用接口。假如要计划年夜的功效单位,则利用笼统类。
- 假如要在组件的一切完成间供应通用的已完成功效,则利用笼统类。笼统类同意部分完成类,而接口不包括任何成员的完成。
6.结论
接口和笼统类,是论坛上、教室间会商最多的话题之一,之以是将这个老话题拿出来再议,是由于从我的体味来讲,深入的了解这两个面向对象的基础内容,关于盘活面向对象的笼统化编程头脑相当主要。本文基础概略了接口和笼统类的观点、异同和利用划定规矩,从进修的概念来看,我以为这些总结已足以表达其中心。可是,关于面向对象和软件计划的深切了解,仍是创建在不休理论的基本上,Scott说本人天天保持一个小时用来写Demo,那末我们是否是更应当勤于键盘呢。关于接口和笼统类,请多用而知其然,多想而知其奥吧。
<br>
参考文献:
(USA)JeffreyRichter,AppliedMicrosoft.NETFrameworkProgramming
|
|