Chapter 10 《Composition and Inheritance》

  • 类之间最基本的两个关系:组合和继承。组合和继承是使用现有的类创建一个新类的方法。组合的关系是一个类可以包括对另一个类的引用,来帮助它完成任务;继承则是子类和超类的关系。

抽象类
  • 包含抽象成员的类本身也要声明为抽象的,在类class前面加上abstract,没有实现的方法自动就是抽象的,不用使用abstract修饰符进行修饰。

无参方法
def width(): Int   // 空圆括号方法
def width: Int      // 无参方法
  • 如果没有参数,推荐的是使用无参方法(不改变状态的状态下),因为要支持所谓的统一访问原则,使用方的代码不受到某个属性是方法还是字段实现的影响。如果是无参的方法,在理论上都是可以省去圆括号的,但是如果该参数有副作用,比如说输出到屏幕或者修改了状态,最好还是使用()进行标注提醒,如果仅仅是访问某个属性,则可以省略。

extends
    1. extends继承了超类的所有非私有成员。而且如果子类中已经实现了相同名称和参数的成员,成为子类重写了超类的成员。如果子类是具体的,超类的抽象的,也可以是子类实现了超类。
    1. 子类型的意思是子类的值可以被用在任何使用超类值的场合。
    1. Scala中字段和方法属于用一个命名空间。可以使用字段来重写无参方法。
      Scala中的命名空间只有值(字段,方法、包和单例对象)和类型(类和特质名)。可以使用val来重写一个无参方法。同时不允许无参方法和val有同样的标识符。
    1. class A(val a: Int)同时定义了类参数和同名字段。也可以使用var定义,也可以在字段上添加访问修饰符。
    1. 调用超类主构造方法的语法:
class LineElement(s: String) extends ArrayElement(Array(s)) {……}
    1. 子类在重写了超类字段和方法的时候,是需要明确加上override关键字的。不小心出现的重写,是脆弱基类问题最常见的表现方式。主要表现为如果你想在继承关系中的基类中添加新的成员,将面临破坏使用方代码的风险,比如使用方早就定义了你要添加的新的成员方法。

多态和动态绑定
    1. 一个超类的变量可以存在多种子类形态,这种现象称为多态。
    1. 对变量和表达式的方法调用是动态绑定,实际被调用的方法实现是基于运行时的对象中的方法,而不是变量来决定的。

声明final成员
  • final成员不能被子类继承。final类不能被继承。

定义工厂对象
    1. 工厂对象中包含了创建其他对象的方法。使用方使用工厂对象构造对象,而不是直接new,这样使得对象创建逻辑可以被集中起来,对象是如何使用具体的类被表示,这样的逻辑可以被隐藏起来。暴露的细节少,提供了更多的机会在未来不破坏使用方代码的前提下修改类库的实现。
    1. 一般是将创建对象的工厂对象放在类的伴生对象中,也就是单例对象中。这样可以隐藏实现类的细节。如果实现类不需要想被暴露的话,可以将实现类放在单例对象中声明为private属性。Scala中允许在单例和类中定义单例和类。

你可能感兴趣的:(Chapter 10 《Composition and Inheritance》)