最近在研究.NET Core的一些类库源码的时候发如今底层类库中使用了大量的抽象类,然而发现本身搬砖这么多年好像历来没有在项目中使用抽象类或者抽象方法去实现某个功能模块,而且对修饰符Abstract概念也只懂得一些皮毛(也就是面试的时候会问下其基本做用)。固然,我们不懂就要去慢慢的学习了解,不能让这些不懂的技术和知识点一直困扰着咱们。接下来就让咱们一块儿去探索C# Abstract修饰符的做用,而且了解在什么场景下咱们会使用到抽象类,从而提高咱们项目的健壮性。html
基本概念:abstract修饰符指示要修改的东西有缺失或不完整的实现。面试
修饰范围:abstract修饰符能够用于修饰类、方法、属性、索引器(indexer)和事件。ide
public abstract class HttpRequest{}
//todo:抽象方法不能提供实际的实现,所以没有方法主体(而且抽象方法只可以在抽象类中声明) public abstract void ActionMethod();
public abstract string ContentType { get; set; }
public string this[int index] => $"获取_{index}";
//首先声明该事件的委托类型 public delegate void BoilerLogHandler(string status); // 基于上面的委托定义事件 public abstract event BoilerLogHandler BoilerEventLog;
是一个可以提供给多个派生类共享的通用基类。函数
接口提供了派生类应遵循的标准结构。学习
一、抽象类是特殊的类,除了不能实例化(只能经过实例化继承抽象方法的派生类来获取抽象类中的成员)外,具备类的其余特性(能够单继承)。
二、抽象类能够定义抽象方法,抽象方法没有现实。
三、继承抽象类的类必须把里面的抽象成员(成员包括:方法,属性,索引器,事件)所有重写(orveride),抽象类除外。优化
一、接口没法直接进行实例化。ui
二、一个类或结构能够实现多个接口。this
三、实现接口的任何类或结构都必须实现其全部成员。spa
四、接口包含的成员只有方法,属性,索引器(有参属性),事件四种成员。.net
五、接口不能包含实例字段、实例构造函数或终结器。
六、默认状况下,接口成员是公共的,不能有其余的修饰符。
一、均可以被继承
二、都不能直接被实例化
三、均可以包含方法声明且都没有实现
四、派生类必须实现未实现的成员
一、接口能够被多重实现,抽象类只能被单一继承。
二、接口能够用于支持回调,继承并不具有这个特色。
三、抽象类能够定义字段、方法、属性、事件、索引器的实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。
四、接口中的成员访问类型默认为公共的,不能有其余的访问修饰符修饰。
五、定义的关键字不同,抽象类须要使用abstract,而接口则使用interface。
一、抽象类表共性(常应用在具备相同的行为和特征中),而接口则表规范(用于定义一种行为)。
二、抽象类主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。
三、若是要设计大的功能单元,则使用抽象类;若是要设计小而简练的功能块,则使用接口。
四、若是预计要建立组件的多个版本,则建立抽象类。接口一旦建立就不能更改。若是须要接口的新版本,必须建立一个全新的接口。
五、若是建立的功能将在大范围的全异对象间使用,则使用接口;若是要在组件的全部实现间提供通用的已实现功能,则使用抽象类。
六、分析对象,提炼内部共性造成抽象类,用以表示对象本质,即“是什么”。为外部提供调用或功能须要扩充时优先使用接口。
七、好的接口定义应该是具备专注功能性的,而不是多功能的,不然形成接口污染。若是一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其余方法,就叫接口污染。
实例一:就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我能够给你个具体的铁门或木门(多态);并且只能是门,你不能说它是窗(单继承);一个门能够有锁(接口)也能够有门铃(多实现)。 门(抽象类)定义了你是什么,接口(锁)规定了你能作什么(一个接口最好只能作一件事,你不能要求锁也能发出声音吧(接口污染))。
实例二:好比说咱们一个班级有不少为同窗,这些同窗都有着各自的特长,爱好,穿衣打扮的风格,所以咱们减小代码冗余能够定义一个通用的学生抽象类用来描述学生的身高,体重,姓名,爱好,特征等相关特征和行为的公共抽象类。
实例三:咱们须要建立 “狗”、“猫”、“鱼”、“马”这些对象(类),咱们能够说他们有一些共同的属性像嘴巴、尾巴、重量、颜色、大小等等一些共同的属性(properties),可是它们彼此的属性的形状是不一样的(如嘴巴),在这种状况下,咱们若是一个个去定义各自相似的属性是否是比较繁琐?若是用抽象类是否是很方便的给他们去继承。抽象类也有个更加好的地方,体如今“同质异像”就是实质相同实现形式不一样的方法继承上,例如上面的狗、猫、马等的呼吸这个方法或者跑的速度的方法形式不一样,咱们这个是用定义一个抽象方法,让他们各自的类去实现它是否是很方便。“抽象”的意义正在于此。将共同的东西抽出来封装,但不实现只给继承。
经过对抽象类的深刻理解发现原来在程序设计方面须要考虑优化的问题仍是有不少不少的,抽象类和接口的选择就是一个很典型的例子。每每咱们会图简单而去直接定义接口使用,却每每忽视了后期的软件的健壮性和可拓展性。在之后的开发中须要多思考这方面的问题。最后假如文章有什么须要补充或者不足的地方但愿你们指正,谢谢。
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/abstract-and-sealed-classes-and-class-members
https://blog.csdn.net/lizhenxiqnmlgb/article/details/82346478
https://kb.cnblogs.com/page/41836/