`
庄表伟
  • 浏览: 1149040 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

敲响OO时代的丧钟!——继承、重用、多态

阅读更多

  OO的核心思想就是继承,那么,OO为什么要继承呢?对于这个问题,OO的理论大师们有好多个版本的解释:

  1、“这是OO的类型系统自然的要求。设想一下生物学的分类系统:动物——>哺乳动物——>灵长类动物——>人类。或者设想一下我们的概念系统:机器——>交通工具——>汽车——>小轿车。这样的现象在你的生活中难道不是随处可见吗?”

  2、“如果你有一个类,叫做车辆,这个车辆类能够移动,现在你要建立一个子类,叫做家庭型轿车,你就可以直接继承车辆这个类,而不需从头再写移动部分的代码了呀!”

  3、“如果你有三个类,三角形、四边形、正方形,他们都需要显示在屏幕上,那么你就可以建立一个基类叫多边形,提供一个draw()方法,然后让那个三个类都继承这个多边形类并且覆盖那个draw()方法,这样,你就可以在绘图的时候,统一对一种多边形类进行操作,不用去管那个对象究竟是哪一种多边形。”

  这三种解释,是最为典型的OO继承的好处的解释了。但是你如果仔细的看,就能发现这三种好处,分别描述的是:“概念的特化”、“代码的重用”以及“接口的重用”。或者可以分别命名为:“继承”、“重用”、“多态”。

  “这样有什么问题吗?”,也许有人会问。问题就出在这三个好处是用一种方法提供,而这三个好处相互之间有时是相通的,有时又是矛盾的!当我们运用OO语言,来写这样的继承的语句时,一切都是“搅和在一起的”!

  假设Class A有两个属性和两个方法:String a1;int i;void f1();void f2();当我们另外写一个Class B去继承Class A的时候,我们可以继续使用某些属性,而覆盖另一些属性,还可以继续使用某些方法,而重写另一些方法。还可以添加一些新的属性,还可以添加一些新的方法。如果在加上各种访问控制符的限定与修正。谁能够告诉我:“这个Class B究竟想干什么?!”

  也许有人会继续为这样的现象辩解:“这是对于继承的误用,正确的OO程序不会这样的!”
  但是,这个辩解并不成立,几乎所有的OO的编程语言,都没有在继承问题上做出太多“非此即彼”的限制,原因只有一个,那就是,在某些特定的场合,这样的“拼盘”是相对最合理的编码方式。

  我们前面还没有提到多重继承,一个允许多重继承的语言,会让这个问题更为复杂,也可以说会使得场面越发的混乱。让我们举一个例子,这是Eiffel语言的继承语法,让我们看一看面对继承这样一件事情,一个程序员,究竟需要考虑多少问题。来源是《对象揭密》,我就一边抄,一边直接翻成中文了。

  继承    :inherit 父类列表
  父类列表  :{父类 ";" ... }
  父类    :类名[特性适配说明]
  特性适配说明:[Rename]    :重命名以消除名字冲突
         [New_exports] :重新设定特性导出的分组
         [Undefine]   :撤销定义
         [Redefine]   :重定义以取代虚函数
         [Select]    :更加高级的功能
         end

  最值得看的就是这个特性适配说明,更加深入的说明还是各位自己去找书看吧。这就是号称优雅的解决了OO继承问题的Eiffel语言。他所谓的优雅,可以不客气的说,就是把所有的麻烦都明确的告诉你,而不是像C++和Java那样,假装什么事情都没有发生过。但是,麻烦依然在那里,并没有减少,根本的解决方法,是应该不让这样的麻烦出现呀!可是OO确实无法做到这一点。

  因为他把数据和操作封装在了一起,然后又偷换了实体本质的概念,在这样的情况下的OO,他的继承是肯定搞不好的!

(未完待续)

分享到:
评论

相关推荐

    第8章动物类派生——继承与多态.ppt

    继承与多态 继承是面向对象编程(Object-Oriented Programming)中的一种机制,允许一个类继承另一个类的属性和行为。通过继承,子类可以重用父类的代码,减少代码的冗余和重复。同时,继承也可以实现多态性,即...

    QtC++回合制小游戏——继承与多态的练习

    在本项目"QtC++回合制小游戏——继承与多态的练习"中,我们将深入探讨C++编程语言中的两个核心概念:继承与多态。这是一个非常实用的学习方式,通过一个可交互的游戏场景来实践这些理论知识,使得学习过程更加生动...

    C++经典实例——体现继承和多态

    这个名为“C++经典实例——体现继承和多态”的资源显然是为了帮助开发者深入理解和应用这两个关键特性。下面我们将详细探讨这两个主题以及它们在实际编程中的应用。 首先,我们来看“继承”。继承是面向对象设计的...

    Java实验报告——类的继承、多态的应用

    在本实验报告中,我们将深入探讨Java编程中的两个核心概念:类的继承和多态的应用。实验主要目标是加深对抽象类和抽象方法的理解,并掌握如何在实际编码中实现类的继承以及多态性。 首先,让我们理解抽象类和抽象...

    C#第六章 初始继承和多态.pdf

    C#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdf C#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdf

    Educoder题目:Java面向对象 - 封装、继承和多态答案解析.md

    Educoder题目:Java面向对象 - 封装、继承和多态答案解析

    Educoder题目:Java面向对象 - 封装、继承和多态的综合练习答案解析.md

    Educoder题目:Java面向对象 - 封装、继承和多态的综合练习答案解析

    第八节 面向对象——抽象,多态

    对java的一个了解,面向对象,继承,抽象,多态

    java基础继承封装多态

    本资源摘要信息将对 Java 基础知识点进行总结,涵盖继承、封装、多态等概念,并对面向对象的设计、数据库设计模式等进行讲解。 继承 继承是 Java 中的一种机制,允许一个类继承另一个类的属性和方法。继承的语法是...

    C++继承与多态例子

    继承允许我们创建一个新类(子类),它继承了另一个类(父类)的属性和方法,从而实现了代码的重用和扩展。多态则是指同一种行为在不同对象上表现出不同的形式,增强了程序的灵活性。 首先,让我们详细讨论继承。在...

    CPP.rar_多态 .cpp_继承与多态_继承与多态C++

    总之,这个压缩包提供的资源可以帮助学习者掌握C++中的核心面向对象特性——继承和多态,以及如何利用模板实现代码的复用和泛型编程。通过理论学习和实践操作,可以有效地提高编程技能,为编写更高效、更具可维护性...

    java面向对象三要素封装继承和多态源码

    java面向对象三要素封装继承和多态源码java面向对象三要素封装继承和多态源码java面向对象三要素封装继承和多态源码java面向对象三要素封装继承和多态源码java面向对象三要素封装继承和多态源码java面向对象三要素...

    教学视频-继承&多态

    在编程领域,继承和多态是面向对象编程(OOP)中的两个核心概念,尤其是在Java这样的面向对象语言中。这两个概念极大地增强了代码的重用性和灵活性,使得软件设计更加高效和模块化。以下是对这两个概念的详细解释: ...

    继承与多态程序演示

    在编程领域,继承和多态是面向对象编程(OOP)中的两个核心概念,它们极大地提高了代码的重用性和灵活性。在这个"继承与多态程序演示"中,我们将深入探讨这两个概念,以及如何在Microsoft Foundation Classes (MFC) ...

    c语言实现继承与多态

    【C语言实现继承与多态】的探讨主要集中在如何在非面向对象的语言——C语言中,利用其特性模拟实现面向对象编程的关键概念:封装、继承和多态。 封装是面向对象设计的基础,它通过将数据和操作数据的函数捆绑在一起...

    java中继承与多态的题目

    通过实验,我们可以看到继承和多态的应用,可以简化程序的设计和实现,提高代码的重用性和可维护性。 结论 本资源摘要信息涵盖了 Java 中继承和多态的基本概念和应用,通过实验内容,我们可以看到继承和多态的强大...

    使用C语言实现封装,继承,多态等面向对象的特性

    使用C语言实现封装,继承,多态等面向对象的特性使用C语言实现封装,继承,多态等面向对象的特性使用C语言实现封装,继承,多态等面向对象的特性使用C语言实现封装,继承,多态等面向对象的特性使用C语言实现封装,...

    C#继承和多态的应用

    C#继承和多态的应用

    C++随堂测试(继承、多态、重载)(答案).docx

    C++随堂测试(继承、多态、重载) 本资源摘要信息涵盖了C++编程语言中三个重要的概念:继承、多态和重载。通过本资源,读者可以了解到C++中继承的特点和种类、多态的实现方式、重载的规则和限制等。 1. 继承:C++...

Global site tag (gtag.js) - Google Analytics