合成与继承的结合

许多时候都要求将合成与继承两种技术结合起来使用。下面这个例子展示了如何同时采用继承与合成技术,从而创建一个更复杂的类,同时进行必要的构建器初始化工作:
 

//: PlaceSetting.java
// Combining composition & inheritance

class Plate {
  Plate(int i) {
    System.out.println("Plate constructor");
  }
}

class DinnerPlate extends Plate {
  DinnerPlate(int i) {
    super(i);
    System.out.println(
      "DinnerPlate constructor");
  }
}

class Utensil {
  Utensil(int i) {
    System.out.println("Utensil constructor");
  }
}

class Spoon extends Utensil {
  Spoon(int i) {
    super(i);
    System.out.println("Spoon constructor");
  }
}

class Fork extends Utensil {
  Fork(int i) {
    super(i);
    System.out.println("Fork constructor");
  }
}

class Knife extends Utensil {
  Knife(int i) {
    super(i);
    System.out.println("Knife constructor");
  }
}

// A cultural way of doing something:
class Custom {
  Custom(int i) {
    System.out.println("Custom constructor");
  }
}

public class PlaceSetting extends Custom {
  Spoon sp;
  Fork frk;
  Knife kn;
  DinnerPlate pl;
  PlaceSetting(int i) {
    super(i + 1);
    sp = new Spoon(i + 2);
    frk = new Fork(i + 3);
    kn = new Knife(i + 4);
    pl = new DinnerPlate(i + 5);
    System.out.println(
      "PlaceSetting constructor");
  }
  public static void main(String[] args) {
    PlaceSetting x = new PlaceSetting(9);
  }
} ///:~

尽管编译器会强迫我们对基础类进行初始化,并要求我们在构建器最开头做这一工作,但它并不会监视我们是否正确初始化了成员对象。所以对此必须特别加以留意。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, class
, fork
, extends
, system
, constructor
println
以撒的结合存档继承、以撒的结合胎衣 继承、以撒的结合 死 继承、继承与创新结合的事例、超能继承者饰品合成,以便于您获取更多的相关知识。

时间: 2024-10-28 03:10:26

合成与继承的结合的相关文章

合成和继承学习总结

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

到底选择合成还是继承

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

继承的构造函数

一.继承的构造函数 在C++11新标准中,派生类能够重用其直接基类的构造函数.尽管如我们所知,这些构造函数并非以常规的方式继承而来,但是为了方便,我们不妨姑且称其为"继承"的.一个类只初始化它的直接基类,出于同样的原因,一个类也只继承其直接基类的构造函数.类不能继承默认.拷贝和移动构造函数.如果派生类没有直接定义这些构造函数,则编译器将为派生类合成它们. 派生类继承基类构造函数的方式是提供一条注明了(直接)基类名称的using声明语句.举个例子,我们定义Bulk_quote类,如下:

ASP.NET入门随想六之大航海家

asp.net 多隆云:我和韦春花的关系是很纯洁的:网易称其和迷蝶女友的关系是培训双向选择制:杨振宁言<易经>思想阻碍了中国近代科学的发展:逻辑学家论:概念间的关系有五种,即同一.包含.交叉.分离.互斥.而康托尔却认为:关系是有序偶. ■ 我要懒+笨 - 程序设计的终极目标 前不久社区里出现题为<这样的程序员是否算是一个合格的程序员?>的热贴,楼主言一手下编码花时间比别人多但代码规范健壮,设问这样的程序员是否可以留用且如何用?顿时掀起一片哗然,展开在中国这个特定的环境下何为程序设计

TIJ阅读笔记(第六章)

笔记 6:复用类 合成所使用的语法  如果想对reference进行初始化,那么可以在以下几个时间进行:    1.在定义对象的时候.这就意味着在构造函数调用之前,它们已经初始化完毕了.    2.在这个类的构造函数里.    3.在即将使用那个对象之前.这种做法通常被成为"偷懒初始化(lazy initialization)".如果碰到创建对象的代价很高,或者不是每次都需要创建对象的时候,这种做法就能降低程序的开销了.    继承所使用的语法.    继承设计方面有一条通用准则,那就

JAVA:类再生

复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情. 两种代码重用机制:组合和继承 1.组合语法 组合:将对象引用置于新类中 类中域为基本变量时能够自动被初始化为零.但是对象引用会被初始化为null 初始化引用,可以在代码中下列位置进行: 1.在定义对象的地方.这意味着它们总是能够在构造器之前被初始化 2.在类的构造器中 3.就在正要使用这些对象之前,这种方式称为惰性初始化 4.使用实例初始化. 2.继承语法 继

构建器的调用顺序

构建器调用的顺序已在第4章进行了简要说明,但那是在继承和多形性问题引入之前说的话. 用于基础类的构建器肯定在一个衍生类的构建器中调用,而且逐渐向上链接,使每个基础类使用的构建器都能得到调用.之所以要这样做,是由于构建器负有一项特殊任务:检查对象是否得到了正确的构建.一个衍生类只能访问它自己的成员,不能访问基础类的成员(这些成员通常都具有private属性).只有基础类的构建器在初始化自己的元素时才知道正确的方法以及拥有适当的权限.所以,必须令所有构建器都得到调用,否则整个对象的构建就可能不正确.

什么是上溯造型(java)

之所以叫作这个名字,除了有一定的历史原因外,也是由于在传统意义上,类继承图的画法是根位于最顶部,再逐渐向下扩展(当然,可根据自己的习惯用任何方法描绘这种图).因素,Wind.java的继承图就象下面这个样子: 由于造型的方向是从衍生类到基础类,箭头朝上,所以通常把它叫作"上溯造型",即Upcasting.上溯造型肯定是安全的,因为我们是从一个更特殊的类型到一个更常规的类型.换言之,衍生类是基础类的一个超集.它可以包含比基础类更多的方法,但它至少包含了基础类的方法.进行上溯造型的时候,类

java类再生

"Java引人注目的一项特性是代码的重复使用或者再生.但最具革命意义的是,除代码的复制和修改以外,我们还能做多得多的其他事情." 在象C那样的程序化语言里,代码的重复使用早已可行,但效果不是特别显著.与Java的其他地方一样,这个方案解决的也是与类有关的问题.我们通过创建新类来重复使用代码,但却用不着重新创建,可以直接使用别人已建好并调试好的现成类. 但这样做必须保证不会干扰原有的代码.在这一章里,我们将介绍两个达到这一目标的方法.第一个最简单:在新类里简单地创建原有类的对象.我们把这