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

打印 上一主题 下一主题

主题 800|帖子 800|积分 2400

参考: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++ 本身没有接口关键字.也没有接口这种数据类型. 不过通过定义抽象类,可以实现定义一种接口. 通过继承抽象类(多半采用多继承),可以实现接口继承”


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立山

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表