scala中的trait

scala是以实现scaleable language为初衷设计出来的一门语言。官方中,称他是object-oriented language和functional language的混合式语言。

三个特殊内容:

1.Tuple-可以将不同类型的数据存储在一个数组里

val pair = (99,"Luftballons")

println(pair._1)

println(pair._2)       输出:99    Luftballons

2.singleton object-scala中没有静态方法和属性 (什么是静态方法?c++中 若类的方法前加了static关键字,则称为静态方法,反之为实例方法。静态方法为类所有,可以通过对象来使用,只要定义了类,不必建立类的实例就可以使用。静态方法只能使用累的静态成员。)全部由singleton object(单例对象)来代替。

class SimpleGreeter {

val greeting = "Hello,world!"

def greet() = println(greeting)

}

val g = new SimpleGreeter

g.greet ()

----------------------------------------------------------

class FancyGreeter(greeting:String){

def greet() = println(greeting)

}

val g = new Fancygreeter("Salutations,world")

g.greet

----------------------------------------------------------

class WorldlyGreeter(greeting: String){

def greet() = {

val worldyGreeting = WorldlyGreeter.worldify(greeting)

println(worldyGreeting)

}

}

object WorldlyGreeter{

def worldify(s: String) = s + ", world!"

}

object WorldlyApp{

def main(args: Array[String]){

val wg = new WorldlyGreeter("Hello")

wg.greet()

}

}


3.trait-scala中的类interface物,但是可以拥有方法体,并且可以在类实例化的时候混入,而不需要为了包装某个类而产生子类。

(1)java的interface只定义方法名称和参数列表,不能定义方法体。而trait则可以定义方法体。

如:trai Friendly{

def greet() = "Hi"

}

(2)在java中实现借口用implement,而在scala中,实现trait用extends。scala中的class可以继承0至多个traits.

scala中重写一个方法是需要制定override关键字的。

(3)java的interface和scala中的trait的最大的区别是,scala可以在一个class实例化的时候混合进一个trait。

trait Friendly{

def greet() = "Hi"

}

class Dog extends Friendly{

override def greet() = "Woof"

}

class HungryDog extends Dog{

override def greet() = "I'd like to eat my own dog food"

}

trait ExclamatoryGreeter extends Friendly{

override def greet() = super.greet() + "!"

}

var pet : Friendly = new Dog

println (pet.greet())


pet = new HungryDog

println(pet.greet())


pet = new Dog with ExclamatoryGreeter

println(pet.greet())


pet = new HungryDog with  ExclamatoryGreeter

pritln(pet.greet())


这样写的好处是什么呢?

从前,如果想要输出在HungryDog类的“I'd like to eat my own dog food”输出的基础上变成“I'd like to eat my own dog food!",那么需要再添加一个子类,并重写它的方法,给字符串加上感叹号,而在trait中,只需要在HungryDog类实例化的时候with 上一个trait,就可以达到包装的效果了。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值