Scala学习笔记(10)-抽象继承

1.抽象

abstract class Element { //定义一个抽象类,里面包含一个抽象方法
    def contents: Array[String]
}

请注意类Element的contents方法并没带有abstract修饰符。如果方法没有实现(也就是说,没有等号或方法体),它就是抽象的。不像Java,方法的声明中不需要(或允许)抽象修饰符。拥有实现的方法被称为具体的:concrete。

2.无参数的方法

在调用任何不带参数的方法时可省略空的括号。如:

"hello".length // 没有副作用,所以无须()

总结起来,Scala里定义不带参数也没有副作用的方法为无参数方法,也就是说,省略空的括号,是鼓励的风格。另一方面,永远不要定义没有括号的带副作用的方法,因为那样的话方法调用看上去会像选择一个字段。这样你的客户看到了副作用会很奇怪。相同地,当你调用带副作用的函数,请确信写这个调用的时候包括了空的括号。另一种考虑这个问题的方式是,如果你调用的函数执行了操作,使用括号,但如果仅提供了对某个属性的访问,省略括号。

3.重载方法和字段

Scala里禁止在同一个类里用同样的名称定义字段和方法,而在Java里这样做被允许。

class WontCompile {
    private var f = 0 // 编译不过,因为字段和方法重名
    def f = 1
}

通常情况下,Scala仅为定义准备了两个命名空间,而Java有四个。Java的四个命名空间是字段,方法,类型和包。与之相对,Scala的两个命名空间是:
 值(字段,方法,包还有单例对象)
 类型(类和特质名)
Scala把字段和方法放进同一个命名空间的理由很清楚,因为这样你就可以使用val重载无参数的方法,这种你在Java里做不到的事情。

4.定义final成员

设计一个继承层级的某些时候,你想要确保成员不被子类重载。Scala里和Java里一样,通过添加final修饰符给成员来做到。

你或许还多次想确保整个类都没有子类。要做到这点只要简单地通过在类的声明上添加final修饰符把整个类声明为final即可。

你可能感兴趣的:(Scala学习笔记(10)-抽象继承)