组合与继承之扩展类

接上篇blog,为了实例化一个元素,我们需要创建一个扩展了Element类并实现抽象的contents方法的子类。可能的方式之一:

class ArrayElement(conts: Array[String]) extends Elements {
    def contents: Array[String] = conts
}

ArrayElement类的定义扩展了Element,与java类似,在类名之后使用extends子句表示。这样的extends子句有两个效果:使得ArrayElement类继承Elements的所有非私有的成员(方法与属性,确定属性可以被继承,这与java不同),并且让ArrayElement类型成为Elements类型的子类型。

如果你省略了extends子句,Scala编译器将隐式地假设你的类扩展自scala.AnyRef,这与java平台上的java.lang.Objects相同。因此,Element类隐式地扩展了AnyRef类。

继承表示超类的所有成员也是子类的成员,但以下两种情况例外:第一,超类的私有成员不会被子类继承。第二,超类中的成员若与子类中实现的成员具有相同名称和参数则不会被子类继承。这种情况被称为子类的成员重写(override)了超类的成员。如果子类中的成员是具体的而超类中的是抽象的,我们也可以说具体的成员实现了抽象的成员。

例如,ArrayElement类的contents方法重写了Elements类的抽象方法contents。相应地,ArrayElement类从Element类继承了width和height方法。

子类型化是指子类的值可以在任何需要其超类的值的地方使用。例如:

val e: Element = new ArrayElement(Array("hello"))

变量e被定义为Element类型,所以其初始化的值也应当是Element。但实际上初始化值的类型是ArrayElement。可以这样写的原因是ArrayElement类扩展了Element类,所以ArrayElement类型与Element类型是兼容的。

时间: 2024-07-28 23:17:52

组合与继承之扩展类的相关文章

Python学习之旅—面向对象进阶知识:类的命名空间,类的组合与继承

前言 上篇博客笔者带领大家初步梳理了Python面向对象的基础知识,本篇博客将专注于解决三个知识点:类的命名空间,类的组合以及面向对象的三大特性之一继承,一起跟随笔者老看看今天的内容吧. 1.类的命名空间 在上一篇博客中,我们提到过对象可以动态添加属性,一起来回忆下昨天的知识点,看如下的代码: class A: pass a = A() a.name = 'alex' print(a.name) 这里我们手动为a对象添加了一个属性name,然后直接打印可以得到a对象的名称.通过这个例子,我们可以

python进阶(5):组合,继承

前两天我们认识了面向对象也对面向对象有了初步的认识今天我们先会说一点组合的进阶,今天重点是继承. 一.组合 组合只有一个例子因为组合只作为上一章的补充内容 #老师 课程 生日 class Course: def __init__(self,name,period,price): self.name = name self.period = period self.price = price class Birth: def __init__(self,year,month,day): self.

(转)组合优于继承---设计模式之策略模式

文章来源:http://www.javaeye.com/topic/328262 当我们掌握了Java的语法,当我们了解了面向对象的封装.继承.多态等特性,当我们可以用Swing.Servlet.JSP技术构建桌面以及Web应用,不意味着我们可以写出面向对象的程序,不意味着我们可以很好的实现代码复用,弹性维护,不意味着我们可以实现在维护.扩展基础上的代码复用.一把刀,可以使你制敌于无形而于江湖扬名,也可以只是一把利刃而使你切菜平静.Java,就是这把刀,它的威力取决于你使用的方式.当我们陷入无尽

Effective Java 第三版——18. 组合优于继承

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 18. 组合优于继承 继承是实现代码重用的有效方式,但并不总是最好的工具.使用不当,会导致脆弱的软件. 在包中使用继承是安全的,其中子类和父类的实现都在同一个程序员的控制之

ios 中Category类别(扩展类)专题总结

原创地址   http://www.code4blog.com/archives/294 类别 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类. 类别使得无需创建对象类的子类就能完成同样的工作 一.创建类别 1.声明类别 声明类别与声明类的形式很相似 @interface  NSString(NumberConvenienc

UI(UGUI)框架(二)-------------UIManager单例模式与开发BasePanel面板基类/UIManage统一管理UI面板的实例化/开发字典扩展类

UIManage单实例: 1 /// 单例模式的核心 2 /// 1,定义一个静态的对象 在外界访问 在内部构造 3 /// 2,构造方法私有化 4 5 private static UIManager _instance; 6 7 public static UIManager Instance 8 { 9 get 10 { 11 if (_instance == null) 12 { 13 _instance = new UIManager(); 14 } 15 return _instan

day26--静态属性、类方法、静态方法、组合、继承

一.静态属性 class Room: tag=1 def __init__(self,name,owner,width,length,heigh): self.name=name self.owner=owner self.width=width self.length=length self.heigh=heigh @property def cal_area(self): # print('%s 住的 %s 总面积是%s' % (self.owner,self.name, self.widt

组合与继承有什么区别

组合和继承是面向对象中两种代码复用的方式.组合是指在新类里面创建原有类的对象,重复利用已有类的功能.继承是面向对象的主要特性之一,它允许设计人员根据其它类的实现来定义一个类的实现.组合和继承都允许在新的类中设置子对象(subobject),只是组合是显式的,而继承则是隐式的.组合和继承存在着对应关系:组合中的整体类和继承中的子类对应,组合中的局部类和继承中的父类对应. 二者的区别在哪里呢?首先分析一个实例.Car表示汽车对象,Vehicle表示交通工具对象,Tire表示轮胎对象.三者的类关系下图

组合优于继承

原文地址:http://leihuang.org/2014/11/18/composition-inheritance/ 为什么组合优于继承? 这是一个非常典型的设计模式的问题,Head First Design Pattern第一章好像就讲了,之前看得有点忘了.以下我把stackoverflow上面得分比較高的答案搬过来用一下,我认为这样更easy理解些. 两者差别 Think of composition as a has a relationship. A car "has an"