scala中有抽象方法,抽象字段,抽象类型,举一个例子:
trait AbstractTrait {
type T
def method(arg:T):T
val v1:T
var v2:T
}
abstract class AbstractClass {
type T
def method(arg:T):T
val v1:T
var v2:T
}
有抽象成员,则此class或trait肯定必须通过子代实现这些抽象成员
class ConcreteTrait extends AbstractTrait {
type T = String
def method(arg:String) = "hello " + arg
val v1:String = "v1 value"
var v2:String = v1
}
抽象类型指由type关键字声明,不带具体定义的类或特质的成员的类型,如上面type T.抽象字段如val v1:T和var v2:T,指定了val和var的名称和类型,但不指定值,抽象val可以重定义父中的抽象def成员:
trait AbstractTrait {
type T
def method(arg:T):T
def m:T
val v1:T
var v2:T
}
abstract class Abstractclass extends AbstractTrait {
val m:T //抽象val重定义抽象def
}
class ConcreteAbstractclass extends Abstractclass {
override type T = Int
override val m: T = 100
override def method(arg: T): T = 111
override val v1: T = 10
override var v2: T = v1
}
class ConcreteTrait extends AbstractTrait {
type T = String
def method(arg:String) = "hello " + arg
def m:String = "ConcreteTrait"
val v1:String = "v1 value"
var v2:String = v1
}
class ConcreteTrait2 extends AbstractTrait {
type T = Int
def method(arg:T) = 2 * arg
def m:T = 100
val v1:T = 12
var v2:T = v1
}
主main中:
val m = new ConcreteAbstractclass()
println(m.m)
val c = new ConcreteTrait2
println(c.method(1))
val c1 = new ConcreteTrait
println(c1.m)
显示如下:
100
2
ConcreteTrait