C#里的抽象类与接口(开个小头)
总摘要
学习总结刘铁猛老师的课程,写出的如下笔记
接口和抽象类的定义:
- 接口和抽象类,都是“软件工程产物”。
- 具体类->抽象类->接口: 他们是越来越抽象,内部实现的东西越来越少。
(设计模式的学习前提需要透彻理解了接口和抽象类,并能在项目熟练使用。而且需要solid设计原则可以很好运用) - 抽象类是未完全实现逻辑的类(可以有字段和非public成员,他们代表了“具体逻辑”)
- 接口是完全未实现的类(“纯虚类”;只有函数成员;全员public)
- 接口为了解耦而生:高内聚,低耦合的追求;方便单元测试
- 接口是个“协约”
- 他们都不能实例化
( 接口的具体解释接下一部分,此篇主要说的是抽象类)
抽象
从抽象类进行开始,作为切入点则更好理解,所以首先介绍为做基类而生的“抽象类”与“开房/关闭”原则
抽象类
我们平时说类的时候,都是默认的具体类,如果是抽象类一定会特地的说出来。要创建抽象类,一定要加abstract指出来,未被实现的成员,也要用abstract来修饰,而且他们不能是private。因为,一定是抽象类的子类来去实现它。
abstract class Student//抽象类{abstract public void Study();//没有方法体的抽象方法}
不允许去实例化一个抽象类,它就剩下可以作为基类把自己派生出去,或者声明变量,利用多态。用父类的变量实现子类的实例。
开闭原则
大意是指,不是为了修bug或添加新的功能,不要去修改类的内容。
下面例子中,很好的展现了开闭原则:利用创建一个抽象类,然后派生子类,达到不改动最初的基类里的代码,仍可以添加各种新的需要。同时凸现了抽象类作为基类的作用以及运用多态实现灵活调用方法而不用去修改基类。(这里我们就不用在Vehicle这个类里添加一些方法来达到引用下面新增类里需要的方法,而是利用多态,不改变基类里的代码,也可以实现功能)这样,我增加子类,就不需要改动基类里的代码,而是直接添加子类,然后创建子类的对象实例即可。(下面有个反例)
class Program{static void Main(string[] args){Vehicle v = new Car();//利用抽象和多态,达到用基类变量创建需要的对象实例,从而引用相对于的方法v.Run();Vehicle o = new Truck();o.Run();}}abstract class Vehicle//这里是创建了一个抽象类{public void Stop(){Console.WriteLine("stpped!");}public abstract void Run();//创建了一个纯虚方法,因为在抽象类里不需要这个方法有方法体,只是将它作为基类创建变量}class Car:Vehicle{public override void Run(){Console.WriteLine("Car is running......");}}class Truck:Vehicle {public override void Run(){Console.WriteLine("Truck is running......");}}class RaceCar:Vehicle{public override void Run(){Console.WriteLine("RaceCar is running......");}}
在Vehicle这个基类里面修改代码达到引用派生类的方法,但是不这样用:
class Vehicle//这种方式不符合开闭原则{public void Stop(){Console.WriteLine("stpped!");}public void Run(string type){if (type == "car"){Console.WriteLine("Car is running......");}else if (type == "truck"){Console.WriteLine("Truck is running......");}}
那写到这了,思考,一个基类可不可以里面的方法全都是纯虚方法。当然是可以的。如下:
abstract class VehicleBase//一个纯虚类,里面的方法全是纯虚方法{abstract public void Stop();abstract public void Run();}abstract class Vehicle:VehicleBase//这个抽象类就继承了上面的Stop{public override void Stop(){Console.WriteLine("stpped!");}}
后面的Car类与Truck类一样,他们都从最初的纯抽象基类VehicleBase给继承下来了。实现了从特别抽象到抽象再到具体这么一个过程的变化。
接口
在java和c#里面,这种纯抽象类,一般就是接口了。 只需要把abstract class换成interface这个关键字就好,并且里面的abstract public全都去掉。因为interface里面要求全都是抽象类。那自然子类里要用这个接口里面的纯虚方法的就不需要加上override修饰了。
interface VehicleBase//这就是接口{void Stop();void Run();}abstract class Vehicle:VehicleBase{public void Stop() //这里便使用了上面写的一个接口{Console.WriteLine("stpped!");}abstract public void Run();//这里的Run不是上面的接口,而是定义的一个纯虚方法,供子类调用
上述代码实现了不完全实现的抽象类。不过一般的接口,不会这样命名,一般用I开头。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
