我们在运用C#的笼统类和接口的时刻,往往会碰到以下相似的题目,大抵归结如下:
(1)笼统类和接口有什么实质的区分和联络?
(2)什么时刻挑选运用笼统类,然啥时刻运用接口最适当呢?
(3)在项目中如何运用才使得项目更具有可保护性、扩大性?如何将它和Struct,类严密的连系,到达终究的双刃剑作用?
解决方案:
这也是我在进修笼统类和接口的时刻碰到的题目,从我归结的这三个题目,不难看出这也许是我们大多数顺序员碰到题目的三个阶段,
第一阶段(基本观点):就象题目1一样,这部份人起首须要扫清基本观点的停滞,起首得晓得什么叫笼统类,什么叫接口?
然后相识笼统类和接口之间的区分和联络是什么?固然这能够须要一段时间去明白和实践,毕竟这些观点比较笼统,属于那种摸不着看不到的东西,固然最主要照样多演习,没事的时刻做个Demo实例,把它们都运用一遍,在运用的过程当中多想想为何要如许用?这用有什么优点?能不能运用接口呢,假如不能,运用笼统类优点又在哪?如许能够加深对它们的明白,这也是我的一点点履历吧,呵呵!说了这么多,我照样把题目1总结一下,一是轻易本身记,二是加深明白吧。
笼统类和接口的观点:实在这些观点在教科书和博客里基本上一大堆,先辈们总结的也很好了,然则能够在浅显、易懂方面有点艰涩难明,我就翻译一下,加点陕西版的白话文,嘿嘿。
(1)笼统类:供应了一组派生类访问共享基类的大众要领;
笼统类的特征是:(1)笼统类既包括笼统要领,也能够包括要领的完成;(2)笼统类不能被实例化,也不能被密封;(3)笼统类中的笼统要领要么在派生类中完成,要么用派生笼统类继续(笼统派生类能够继续基类笼统要领的),假如要在派生类中完成 基类的笼统要领,必需运用override 修饰符;(4)笼统类属于单继续(这点属于一切类的同性,在这提一下)(5)笼统类是一族群的笼统,相似于 IS-A;
以上我假如说的还不是很清晰,给你个官网的关于笼统类的地点:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/abstract
(2)接口:包括了一组虚要领的笼统范例;
接口的特征是:(1)接口中只包括虚要领的定义,只要声明定义,没有函数完成;(2)接口类中能够包括属性、事宜、索引器等,但不能包括字段;(3)接口类属于多继续;(4)继续了接口的类必需悉数完成接口的要领;
笼统类和接口的区分和联络:
相同点:(1)都是不能直接实例化,只能经由过程继续体式格局去完成;
(2)都是对事物行动和对象的笼统,构成肯定的设想形式;
不同点:
(1)接口支撑多继续;笼统类不能完成多继续;
(2)接口包括要领、属性、事宜、索引器,不能包括字段;笼统类能够包括字段,也能够包括要领的完成;
(3)接口能够支撑回调,笼统类不支撑回调
(4)接口能够作为值范例和援用范例基类,而笼统类只能作为援用范例的基类;
第二阶段(运用阶段):就象题目2一样,这部份人对基本有了肯定的相识,但就是缺少肯定的实践,也许就是做个简朴的Demo了事,那末什么时刻用笼统类,啥时用接口呢?
剖析第二个题目,我提出3点发起:
第一个发起,对基本观点不只是观点的影象,要多练、多思,然后再多练、再多思,轮回频频,直到熟烂于心;
第二个发起,只管在本身的项目中运用这方面的学问,去运用它,你才发现题目,解决题目,才会思索;
第三个发起,对本身运用过的笼统类和接口的项目的学问点举行总结和归结;
就什么时刻运用笼统类和接口,我总结先辈的履历,给出以下几点,仅供参考:
(1)当设想的组件将来有多个版本的时刻平常运用笼统类,比方用C#设想数据库DB,刚开始你能够运用的是sql server ,mysql,今后大型的项目能够要运用oracle,DB这类大型的数据库系统,那末我们在设想类的时刻就设想一个笼统的基类DB,让它具有 数据的一些通用的属性和要领,属性:数据库的衔接名,版本,数据库范例,数据库的通用要领:Open(),Close()要领等;
(2)当设想的组件同时支撑通用的行动行动,能够斟酌接口;比方鸟类,人类,车类都能够有声响,这时刻能够设想接口,包括叫的函数行动,然后在各个细致的类中完成;
(3)在继续了接口的派生类或接口中,一旦该接口须要增添行动要领是个比较头疼的事变,必需一切的继续都必需完成它的要领,这个时刻能够在派生类去完成一个新增的接口,来完成派生类的奇特行动,举例申明:
/// <summary> /// 完成一个爬虫类的行动接口 /// </summary> interface IAnimalClimb { void Climb(); } /// <summary> /// 完成一个会叫的动物的行动接口 /// </summary> interface ICry { void Cry(); } /// <summary> /// 完成一个动物笼统类 /// </summary> public abstract class Animal { //动物的名字 public string Name { get; set; } //动物的色彩 public string Color { get; set; } //动物笼统类的共有要领 public abstract void Sleep(); public abstract void Breathe(); } /// <summary> /// 定义鸟类,通用要领是会飞 /// </summary> public class Bird : Animal,ICry { public override void Sleep() { Console.WriteLine("Bird派生类继续了基类的Sleep()要领"); } public override void Breathe() { Console.WriteLine("Bird派生类继续了基类的Breathe()要领"); } //鸟类能够继续一致的接口行动,比方:叫 public void Cry() { Console.WriteLine("Bird派生类继续了接口ICry的叫的要领"); } } /// <summary> /// 定义爬虫类类 /// </summary> public class Snake : Animal, IAnimalClimb { public override void Breathe() { Console.WriteLine("Snake派生类继续了基类的Sleep()要领"); } public override void Sleep() { Console.WriteLine("Snake派生类继续了基类的Sleep()要领"); } //爬虫类能够继续一致的接口动物,比方:爬 public void Climb() { Console.WriteLine("Snake派生类继续了接口IAnimalClimb的爬的要领"); } }
以上代码,只是申明题目,比较简朴;
第三阶段(优化阶段):就象题目3一样,我们在做一个笼统类或许接口的时刻起首斟酌的是能用就行,效果就是定义的类或接口比较多,难以保护和扩大,或许就是类之间有交集,那怎样优化继续关联?如何才使得顺序具有可保护性和扩大性呢?
我个人发起具有以下几个方面方可:
(1)要有踏实的基本学问和深挚的基本功底;
(2)要有一个多问、多思的心;关于笼统类和接口多问问,为何不运用笼统类而要运用接口?为何在这个处所运用接口适宜?
(3)多看看先辈们是怎样设想接口和类的,这方面的材料网上搜搜不少;
(4)个人发起多看看设想形式这方面的学问,由于他们是先辈在设想时的履历和头脑;
以上就是C#中的笼统类与接口的详解的细致内容,更多请关注ki4网别的相干文章!