0 0

求解 Inheritance Composition Mixin30

在Programming ruby 1.9 P_104看到这3个概念的解释,不太明白
1.Mixin到底解决了什么东西,
2.这三者优缺点
3.什么情况下用哪个.
帮忙分析一下,谢谢
2012年5月30日 12:46

1个答案 按时间排序 按投票排序

3 0

《松本行弘的程序世界》里面Matz对Mixi和多重继承解释的非常详细:http://book.douban.com/subject/6756090/

1、继承的原本目的是逐步细化,而不是为了提取共性
因为如果是为了提取共性,那多重继承就会成为主流。

2、多重继承
优点:对真实反映对象间关系。
缺点:关的关系过于复杂,不易理解,容易写“意大利面条程序”。

  • 结构复杂化
  • 优先顺序模糊
  • 功能冲突:不同父类中有相同的方法时会产生冲突。



3、单一继承
优点:继承单纯,是明显的树结构。
缺点:很多继承无法表示,如ReadWriteStream要同时继承ReadStream和WriteStream才行。

4、什么才是完美
多重继承与单一继承各有利弊,引入受限制的多重继承是个好办法。
Java中它就是接口(interface),Lisp和Ruby中是Mixin。

5、继承的两种含义
类的继承包含两种含义。

  • “类有哪些方法”,这是规格的继承。
  • “类的方法是具体怎么执行的”,这是实现的继承。


静态语言中两者区别很重要。Java中实现的继承用extend类,属于单一继承。规格的继承用implements接口,属于多重继承。

6、接口的缺点
Java中用接口来实现多重继承,即变相实现了多重继承,又避免了多重继承带来的功能冲突和复杂性。但这不完美。
接口不能共享。如果想实现共享要用组合模式来调用别的类实现共通功能。很麻烦。

7、Mix-in
与静态语言Java不同,动态语言本来就没有规格继承这种概念。动态语言要实现的只有多重继承,因此用Java的接口对于动态语言不能解决任何问题。
Mix-in规则:

  • 通常的继承用单一继承
  • 第二个及两个以上的父类必须是Mix-in的抽象类。


Mix-in类是这样的抽象类:

  • 不能单独生成实例
  • 不能继承普通类


Ruby只支持Mix-in形式的多重继承,Mix-in的单位是模块(module)

8、两个误解
误解1、对象是对现实世界中具体物体的反映,继承是对物体分类的反映。
结构化编程实现了控制流程的结构化(抛弃goto),但此时要处理的数据还没有结构化,这就是面向对象的作用,即实现了要处理的数据的结构化。最终提高生产率。
最终所有面向对象编程语言都有以下共通功能:i、不需要知道内部的详细处理就可能进行操作(封装、数据抽象)

ii、根据不同的数据类型自动选择适当的方法(多态性)
所以面向对象是对结构化编程的扩展,对象是否是现实世界中具体物体的反映就不重要的。如字符串、数组等很多没有具体物体相对应。而且即使有对应,也只是描述现有物体部分概念而已。程序不需要实现所有功能,它只是处理抽象数据的。

类是对象的模板,包含两方法特性:类型(类的特征)+模块(即方法)。
继承是利用模块的手段。类之间会存在共同点。避免重复的方法是继承。
继承只不过是抽象的功能利用方法,不必牵强为“继承是对现实事物分类的反映”。

误解2、多重继承是不好的,而Mix-in却很好。
多重继承用得不好就会出问题,并不是本身不好。Mix-in只是实现多重继承的一个技巧而已。Java中接口实际上就是多重继承。


2012年5月30日 13:20

相关推荐

    inheritance

    【标题】"inheritance"指的是在编程领域中的继承机制,特别是在面向对象编程(OOP)的概念中。继承是面向对象编程的一个核心特性,允许一个类(子类或派生类)从另一个类(父类或基类)继承属性和方法。这种设计模式...

    AdapterDelegates, 用于RecyclerView适配器的"Favor composition over inheritance".zip

    AdapterDelegates, 用于RecyclerView适配器的"Favor composition over inheritance" AdapterDelegates阅读这个项目的动机在我的博客文章。依赖项这里库在 Maven 中心可用:compile '...

    Inheritance

    《继承在Java编程中的应用与理解》 继承是面向对象编程中的核心概念之一,它允许开发者从已有的类(父类或超类)派生出新的类(子类或派生类),以此来实现代码的复用和扩展。在Java编程语言中,继承通过关键字`...

    La-POO-con-Java.rar_inheritance

    Basic manual of java for beginners with simple and easy descriptions. Inheritance, composition, collections, files, interfaces

    A Swift mixin for UITableViewCells and UICollectionViewCells.zip

    A Swift mixin for UITableViewCells and UICollectionViewCells.zip,A Swift mixin for reusing views easily and in a type-safe way (UITableViewCells, UICollectionViewCells, custom UIViews, ViewControllers...

    inheritance---derived-class.rar_inheritance

    在C++编程语言中,继承(Inheritance)是面向对象编程的一个核心概念,它允许一个类(称为子类或派生类)从另一个类(称为基类或父类)继承特性。这种特性使得代码重用变得简单,同时也能实现多态性。"inheritance--...

    Advanced JavaScript (closures,prototype,inheritance)

    JavaScript,作为一种广泛应用于Web开发的脚本语言,其高级特性如闭包(closures)、原型(prototype)和继承(inheritance)是理解其精髓的关键。本文将深入探讨这些概念,帮助开发者更好地掌握JavaScript的核心。 ...

    EC.zip_eC_inheritance

    How do you choose between inheritance and templates? Between templates and generic pointers? Between public and private inheritance? Between private inheritance and layering? Between function ...

    ACE-inheritance

    ### ACE 类结构与继承关系详解 #### 概述 ACE(Adaptive Communication Environment)是一个广泛应用于网络编程的高性能异步通信框架,它提供了一系列高级、可重用的C++类库,旨在简化分布式系统的开发。...

    Topic 10 Inheritance.md

    Topic 10 Inheritance.md

    C 程序设计教学课件:CHAPTER 8 INHERITANCE.ppt

    这在【标题】"C++程序设计教学课件:CHAPTER 8 INHERITANCE.ppt"中被详细讲解。继承的主要优点包括代码重用和表达程序组件之间的自然关系。 【描述】中提到,通过继承,基类的代码会被派生类自动继承,避免了重复...

    package-and-inheritance.zip_inheritance

    在Java编程语言中,封装、继承和多态是面向对象编程的三大核心概念,它们为构建复杂的软件系统提供了坚实的基础。下面将详细讲解这些概念及其重要性。 **封装**是面向对象编程的基本原则之一,它涉及到将数据和操作...

    求解有理分式方程

    - **继承(Inheritance)**:继承允许一个类继承另一个类的属性和方法,支持代码复用。 - **派生(Derivation)**:派生是继承的一种形式,子类可以扩展或覆盖父类的方法。 #### 三、设计思路与实现细节 ##### 1. 类...

    Chapter7_Java_Inheritance.rar_inheritance

    在Java编程语言中,继承是面向对象编程的一个核心特性,它允许一个类(子类或派生类)从另一个类(父类或基类)继承属性和行为。这个概念是第7章“Java继承”中重点讲解的内容。通过继承,我们可以创建具有共同特性...

    C程序设计教学课件:CHAPTER8INHERITANCE.pptx

    在CHAPTER8INHERITANCE.pptx中,主要讲解了C++中的继承及其相关知识点。 8.1 引入 继承的主要目的是促进代码重用和表达程序组件之间的自然关系。例如,可以创建一个`Vehicle`基类,然后派生出如`Car`, `SaloonCar`,...

    Canalization of Development and the Inheritance of Acquired Characters

    在探讨《渠化的发展与后天性状的遗传》这一主题时,我们首先需要了解文章的核心概念及其背景。本文由沃丁顿(Waddington)于1942年发表在《自然》杂志上,主要关注了两个核心议题:发展生物学中的“渠化”现象以及...

    phpat:PHP Architecture Tester-易于使用PHP建筑测试工具

    支持四类断言: Dependency , Inheritance , Composition和Mixin 。 :information: 退房的部分看到的典型应用案例的一些例子。 安装 :computer_disk: 只需在phpat即可: composer require --dev phpat/phpat ...

    spring-jpa-inheritance

    1. **单表继承(Single Table Inheritance)**:所有子类的数据都存储在同一个表中,通过一个特定的字段(通常是`@DiscriminatorColumn`注解标记的)来区分不同子类的对象。这种策略的优点是简单,但可能导致表结构...

Global site tag (gtag.js) - Google Analytics