为什么clr不允许多重继承?
为什么CLR不允许多重继承?
这个问题乍看起来也许很小白,不允许就是不允许,哪来那么多为什么呢?你以为你是小沈阳啊?
呵呵,不好意思,我还没完,接下来的问题是,为什么所有的类都继承自System.Object?为什么不能实例化抽象(包括抽象类和接口)?为什么接口不能有实现?……对于这些问题,我们真的认真思考过吗?
其 实,面向对象思想,是对现实世界最好的诠释。一切皆对象,在OO中如此,在现实生活中亦是如此。在虚拟的程序中,我们经常会对现实中的各种事物进行建模, 于是“人”、“汽车”等事物就成了代码中的Person和Car。我们为什么会自然而然地进行这样的转换呢?这正是面向对象编程思想的魅力所在。“人”和 “汽车”在现实中都代表一类事物,他们有相同的行为和属性,这就是面向对象中类的概念。
许多年前,当我开始接触面向对象的时候,我 并不能理解书本上晦涩的概念。然而随着CS水平的日益提高,我也逐渐对面向对象有了自己的认识。AK47就是一个类,当你按下B+4+1的时候,就初始化 了这样一个实例。它有自己的属性:大小、颜色、子弹数量、换弹时间;也有自己的行为:发射、换子弹。此后,再将面向对象与现实世界相联系,我逐渐理解了前 面提到的那几个问题。他们的答案都是一个:因为现实世界就是这个样子的。
为什么所有的类都继承自System.Object?因为现实世界所有的事物都可以归为一个绝对抽象的基类。生物、非生物都是这个基类的派生。外形、运动等等就是这个基类的属性或行为。
为什么不能实例化抽象?因为现实世界中不存在抽象的具体事物。抽象是从众多的事物中抽取出共同的、本质性的特征,它并不是某一具体的事物。换句话说,如果存在可以具体化的抽象,那么这个抽象就不是真正意义上的抽象了,它对于事物共性的提取,是错误的。
为 什么不允许多重继承?因为现实世界种不存在多重继承。派生类与基类的关系是IS-A,即派生类是一个基类。人就是动物,动物就是生物,不可能同时还是非生 物。任何一个事物都有所属,我们把动物植物按照一定的纲、门(汗……)分类,就是这个原因。如果存在A既是B又是C,只能说明B是C或者C是B,如果B和 C没有继承关系,那么你说A到底是B还是C呢?当然,随着科技的发展,新的事物层出不穷,有些无法无法按照单继承分类的事物,其实就是一个新的事物。比 如,水路两用车,到底是属于车呢,还是属于船呢?其实都不是,它就是水路两用的交通工具,自成一派。
为什么clr不允许多重继承?