Scala(4)

Composition and Inheritance

  • 看了几章函数式编程的方法,这一章回到面向对象编程,介绍面向对象更高级的知识,包括继承、组合、多态、动态绑定
  • 首先是Abstract classes。这个和其他面向对象的特性没什么不同。不过和java不同的是,如果在类前加上了Abstract关键字,那么就不需要再在抽象方法前加上Abstract关键字了
  • Parameter methods是指不需要接受参数的方法,它们可以直接不用括号调用。但是,在Scala对于无参方法加不加括号有自己的建议:
    1. 当出现下面情况时,即使是调用无参方法,也推荐加上括号:
      a. performs I/O
      b. writes reassignable variables(vars)
      c. read vars other than fields,either directly or indirectly by using mutable objects
      之所以这样规定,是因为上面的调用都会产生side-effect。如果调用无参的,没有side-effect方法,那么就可以省去括号了
  • 其实,在类的定义,Scala有个有趣的地方,就是支持uniform access principle。意思就是: client code should not be affected by a decision to implement an attribute as field or method。而上一条的规定就是利用这样道理。
  • 在Scala中,如果要覆盖父类的field或者method,那么就要显示的使用override关键字了。这样,可以部分解决fragile base class问题。当然,如果是实现抽象方法,或者是定义子类自己的方法就不需要override关键字
  • 在Scala中,如果要调用父类的构造函数,可以不要this指针,只需要把参数传递过去就行了。这和前面说的Scala会自己构造primary constructor一样的道理
  • 同时,Scala还允许我们定义parametric fields,正如前面讲的,Scala会自己创建primary constructor帮助我们把传递进class的参数,赋值给对应的参数。那么parametric fiels可以说也是完成同样的工作,不过这次只是把对象换成了field,这样的话我们就不需要做重复的工作了,通过paramter fields我们就可以在类中访问对应的field
  • 同Java一样,如果想要方法不可以被override,可以加上final关键字。对应的,如果想要类不被继承,也可以使用final关键字
  • CompositionInheritance就有点涉及到设计模式了。Composiitonhas-a关系,而Inheritance则是is-a的关系
  • 这一章还展示如何利用companion objectcompanion class来设计我们的接口 – 可以在companion class定义抽象方法,然后在companion object定义相应的实现类以及工厂方法
  • 最后吐槽一下,这一章例子有点奇葩。。看了两遍才看懂。。。为啥要选这种文本框,选个图案,矩形之类不行吗?

Scala’s Hierarchy

  • 这一章主要是介绍Scala内置的Class Hirearchy

  • Scala的class基本上都会继承Any类,也就是说Any是所有类的基类。在Any类之下,是AnyVal以及AnyRef两个类。AnyVal is the parent class of every built-in value class。有九种这样的类,包括了ByteShortCharIntLongFloatDoubleBoolean以及Unit。前八种分别Java‘s primitive type,并且它们的值在运行时就是Java’s primitive values。

  • 前面八种都不可以使用new关键字进行实例化,因为它们类的定义都是abstract and final。只有最后一种类型Unit有自己的single instance value,写做是()

  • 在基类Any类中,定义如下方法

final def ==(that: Any): Boolean

final def !=(that: Any): Boolean

def equals(that: Any): Boolean

def hashCode: Int

def toString: String

意味着所有的类都可以使用上述的方法。另外==和!= 始终是比较值的大小,不论是对于value class还是reference class,这个和java不同!

  • 除了基本的Value primitive中,每个vale primitive都还有rich value class。Scala会帮我们自动的做隐式转换

  • AnyRef is the base class of all reference classes。在JVM平台上,AnyRef就等于java.lang.Object,而在.NET平台上就代表着System.Object这个类。

  • 一般地,在Scala中,value class就是直接使用Java中的primitive vlaue,只有在必要时才会转换成Object,如将Int转换成java.lang.Integer

  • 除了继承关系金字塔的塔顶之外,塔基也是非常重要的。这里便有两种特殊的“塔基”:Null以及Nothing

  • Null is the type of the null reference,it is a subclass of every reference class.

    Null is not compatible with value types.

  • Nothing是在继承关系金字塔的最底层,是所有类型的子类。但是要注意是, there exists no values of this type。Nothing的基本应用就是发送一个异常终止信号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值