C#入门详解 刘铁锰 抽象类与开闭原则

参考:C#学习笔记(二十二)抽象类与开闭原则:抽象类和接口怎么来的?

补充:

首先,同学问了我一个问题:抽象类和虚基类有什么区别

首先: 什么是虚基类呢?
当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类。
C#中没有虚基类,因为它规定了只能单继承。

虚方法可以由子类来重写,也可以不重写。 抽象方法必须由子类来重写。如果子类没有重写,则需要子类也是抽象类。

如图这个,用virtual,但是一般直接调Car,Truck中的Run(),不会调用Vehicle里的Run(),所以才弄成 抽象的

抽象类 基类有抽象的方法,抽象类里面的抽象方法没有方法的实现,比如这样的 public abstract void Run(); 没有花括号, 个人感觉它是虚方法的一种,虚方法里面可以写一些东西,也可以不写,不写的再用abstract ,但是把这个类写成抽象类之后,就不能new这个类了,会有报错,因为如果要是调这个抽象类其中的抽象方法,这个抽象方法中没有方法体的实现,是不对的(程序会崩溃

另外 虚方法可以由子类来重写,也可以不重写。 抽象方法必须由子类来重写。如果子类没有重写,则需要子类也是抽象类。

如果父类中方法有默认实现,且父类需要被实例化, 考虑定义成普通类,虚方法vitural实现
如果父类中方法无默认实现,且父类不需被实例化,抽象类abstract实现

问题:那么有没有一种可能:一个类中,所有的函数成员的都是抽象的?
在C#中纯虚类,其实就是接口interface。

在C#,java中 纯抽象类 实际相当于 接口( 在C#中 把abstract 替换成interface (interface 类要求所有成员都是public的,public可以不用写的,abstract也可以不用写了, (其实要求是 必须去掉的,避免重复( ))

不过在C#中,接口的命名一般不叫什么Base(如VehicleBase)一般用I开头,如IVehicle, 有接口,有抽象类,有具体类

“ PS: C++ 本身没有接口关键字.也没有接口这种数据类型. 不过通过定义抽象类,可以实现定义一种接口. 通过继承抽象类(多半采用多继承),可以实现接口继承”

posted @ 2022-06-23 18:52  专心Coding的程侠  阅读(72)  评论(0编辑  收藏  举报