到底选择合成还是继承

无论合成还是继承,都允许我们将子对象置于自己的新类中。大家或许会奇怪两者间的差异,以及到底该如何选择。
如果想利用新类内部一个现有类的特性,而不想使用它的接口,通常应选择合成。也就是说,我们可嵌入一个对象,使自己能用它实现新类的特性。但新类的用户会看到我们已定义的接口,而不是来自嵌入对象的接口。考虑到这种效果,我们需在新类里嵌入现有类的private对象。
有些时候,我们想让类用户直接访问新类的合成。也就是说,需要将成员对象的属性变为public。成员对象会将自身隐藏起来,所以这是一种安全的做法。而且在用户知道我们准备合成一系列组件时,接口就更容易理解。car(汽车)对象便是一个很好的例子:
 

//: Car.java
// Composition with public objects

class Engine {
  public void start() {}
  public void rev() {}
  public void stop() {}
}

class Wheel {
  public void inflate(int psi) {}
}

class Window {
  public void rollup() {}
  public void rolldown() {}
}

class Door {
  public Window window = new Window();
  public void open() {}
  public void close() {}
}

public class Car {
  public Engine engine = new Engine();
  public Wheel[] wheel = new Wheel[4];
  public Door left = new Door(),
       right = new Door(); // 2-door
  Car() {
    for(int i = 0; i < 4; i++)
      wheel[i] = new Wheel();
  }
  public static void main(String[] args) {
    Car car = new Car();
    car.left.window.rollup();
    car.wheel[0].inflate(72);
  }
} ///:~

由于汽车的装配是故障分析时需要考虑的一项因素(并非只是基础设计简单的一部分),所以有助于客户程序员理解如何使用类,而且类创建者的编程复杂程度也会大幅度降低。
如选择继承,就需要取得一个现成的类,并制作它的一个特殊版本。通常,这意味着我们准备使用一个常规用途的类,并根据特定的需求对其进行定制。只需稍加想象,就知道自己不能用一个车辆对象来合成一辆汽车——汽车并不“包含”车辆;相反,它“属于”车辆的一种类别。“属于”关系是用继承来表达的,而“包含”关系是用合成来表达的。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, class
, 接口
, 车辆检测
, public
, 一个
void
亿万继承人到底播没播、超能继承者饰品合成、合成油到底是真是假、合成拷贝控制与继承、一站到底选择题,以便于您获取更多的相关知识。

时间: 2024-08-25 12:18:01

到底选择合成还是继承的相关文章

继承-c++基础概念问题不知道到底选择哪个。

问题描述 c++基础概念问题不知道到底选择哪个. 当私有继承时,基类的( )在派生类中成为私有成员,不能通过派生类的对象来直接访问该成员.A. 任何成员 B.公有成员和保护成员C. 保护成员和私有成员 D.私有成员 到底选A还是B... 求指导. 解决方案 A.不同的继承方式只是对基类成员的访问增加权限而已. 解决方案二: 私有成员,也就是private修饰的成员,继承类也不能访问 解决方案三: 对于私有继承,所有成员都是 解决方案四: 你对基础概率不清楚,public,private,prot

合成和继承学习总结

无论继承还是合成,我们都可以在现有类型的基础上创建一个新类型.但在典型情况下,我们通过合成来实现现有类型的"再生"或"重复使用",将其作为新类型基础实施过程的一部分使用.但如果想实现接口的"再生",就应使用继承.由于衍生或派生出来的类拥有基础类的接口,所以能够将其"上溯造型"为基础类.对于下一章要讲述的多形性问题,这一点是至关重要的. 尽管继承在面向对象的程序设计中得到了特别的强调,但在实际启动一个设计时,最好还是先考虑采用合

合成与继承的结合

许多时候都要求将合成与继承两种技术结合起来使用.下面这个例子展示了如何同时采用继承与合成技术,从而创建一个更复杂的类,同时进行必要的构建器初始化工作:   //: PlaceSetting.java // Combining composition & inheritance class Plate { Plate(int i) { System.out.println("Plate constructor"); } } class DinnerPlate extends Pl

空间|时间|对象 圈人 + 目标人群透视 - 暨PostgreSQL 10与Greenplum的对比和选择

标签 PostgreSQL , PostGIS , geohash , brin , gist索引 , Greenplum , HybridDB for PostgreSQL 背景 通常一个人的常驻地可能会包括:家.儿女家.双方父母家.情人.异性伴侣家.公司.商圈若干等. 通过对这些数据的运营,可以实现很多业务需求.例如: 1.寻人 <海量用户实时定位和圈人 - 团圆社会公益系统(位置寻人\圈人)> 2.线下广告投放人群圈选,选址,商圈人群画像. <数据寻龙点穴(空间聚集分析) - 阿里

Microsoft .NET 中的基类继承

接口继承 创建抽象类时,请使用关键字 Interface 而不是 Class.为接口命名,然后定义需要子类实现的所有属性和方法.这是因为基类中没有可以实现的属性和方法,它只包含一般数据,而不包含方法.您所创建的只是一个合约,它规定所有使用此接口的子类都必须遵循一定的规则. 1.        现在,请在已创建的项目中添加一个新类. 2.        从 Visual Studio 菜单中,单击 Project(项目),然后单击 Add Class(添加类). 3.        在类中添加以下

Microsoft .NET 中的基类继承(2)

现在,请在已创建的项目中添加一个新类. 从 Visual Studio 菜单中,单击 Project(项目),然后单击 Add Class(添加类). 在类中添加以下代码:Interface Person   Property FirstName() As String   Property LastName() As StringSub Print()   Sub Talk()End Interface您会发现,您定义属性和子过程的方法与您通常定义这些属性和过程的方法一样.唯一的差别在于,您没

通过继承进行设计

学习了多形性的知识后,由于多形性是如此"聪明"的一种工具,所以看起来似乎所有东西都应该继承.但假如过度使用继承技术,也会使自己的设计变得不必要地复杂起来.事实上,当我们以一个现成类为基础建立一个新类时,如首先选择继承,会使情况变得异常复杂. 一个更好的思路是首先选择"合成"--如果不能十分确定自己应使用哪一个.合成不会强迫我们的程序设计进入继承的分级结构中.同时,合成显得更加灵活,因为可以动态选择一种类型(以及行为),而继承要求在编译期间准确地知道一种类型.下面这个

Javascript继承机制的设计思想分享_javascript技巧

我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instance)的区分,全靠一种很奇特的"原型链"(prototype chain)模式,来实现继承. 我花了很多时间,学习这个部分,还做了很多笔记.但是都属于强行记忆,无法从根本上理解. 直到昨天,我读到法国程序员Vjeux的解释,才恍然大悟,完全明白了Javascript为什么这样

组合查询——继承与多态的小练习

                 上次个人版机房收费做的时候,组合查询这里做的不好,没有抽出模板,导致感觉有很多冗余,这次自己挑U层,一方面是感觉自己的B层和D层做的可以提升的空间目前很小了,另一方面就是想加强一下自己对细节的注意问题.             上次组合查询是这样的,以代码为例:                    U层代码如下:      Imports System.Collections '引入HashTable类 Public Class frmColWorkInfo