Groovy 2.3 trait语法介绍

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

Groovy 2.3 trait语法介绍

http://www.javacodegeeks.com/2014/04/groovy-2-3-introduces-traits.html

前几天,Groovy 2.3的第二个beta版本发布。Groovy 2.3最重要的新特性之一是trait语法。trait是一组可重用的方法和字段,可以将它们混入到一个或多个类中。一个类可以同时拥有多个trait而不需要使用多重继承(从而避免钻石问题)。

基本用法

在Groovy 2.3中,这样定义一个基本的trait:

	trait SwimmingAbility {
	  def swim() {
		println "swimming.."
	  }
	}

trait的定义与类的定义非常相似。SwimmingAbility trait只定义了一个swim()方法。接下来就可以使用implements关键字来向类中加入这个trait:

	class Goldfish implements SwimmingAbility {
	  ..
	}

现在,我们就可以调用Goldfish对象的swim()方法了。

	def goldfish = new Goldfish()
	goldfish.swim()

到这里,我们已经实现了与继承同样的功能。不同的是,我们可以添加多个trait到同一个类中。下面,我们定义其它的trait:

	trait FlyingAbility {
	  def fly() {
		println "flying.."
	  }
	}

再创建一个新的类,同时使用这些trait:

	class Duck implements SwimmingAbility, FlyingAbility {
	  ..
	}

现在鸭子可以游动和飞了:

	def duck = new Duck()
	duck.swim()
	duck.fly()

trait中的this关键字

trait中的this关键字代表了trait的实现的实例,所以,你可以这样写:

	trait FlyingAbility {
	  def fly() {
		println "${this.class.name} is flying.."
	  }
	}

如果调用duck.fly(),将会打印:

	Duck is flying..

一个更复杂的例子

下面的例子将展示trait的更多特性

		trait Trader {

			  int availableMoney = 0
			  private int tradesDone = 0

			  def buy(Item item) {
				if (item.price <= availableMoney) {
				  availableMoney -= item.price
				  tradesDone += 1
				  println "${getName()} bought ${item.name}"
				}
			  }

			  def sell(Item item) {
				..
			  }

			  abstract String getName()
		}

就像Groovy类,trait也支持属性。本例中,availableMoney属性将变成私有的,同时相应的setter和getter方法会被自动生成。在实现中可以访问这些方法。但无法在Trader以外访问tradesDone私有变量。我们还定义了一抽象方法getName(),实现类必须实现它。

现在就创建一个实现Trader的类:

	class Merchant implements Trader {

	  String name

	  String getName() {
		return this.name
	  }
	}

现在Merchant就可以购买东西了:

	def bike = new Item(name: 'big red bike', price: 750)
	def paul = new Merchant(name: 'paul')

	paul.availableMoney = 2000
	paul.buy(bike) // prints "paul bought big red bike"

	println paul.availableMoney // 1250

trait的扩展、覆盖、解决冲突

trait使用extends关键字实现继承:

	trait Dealer {
	  def getProfit() { ... }
	  def deal() { ... }
	}

	trait CarDealer extends Dealer {
	  def deal() { ... }
	}

在这里,CarDealer继承了Dealer,同时覆盖了Dealer的deal()方法。

trait的方法也可以被实现类覆盖:

	class OnlineCarDealer implements CarDealer {
	  def deal() { ... }
	}

如是一个类同时实现了多个trait,就很有可能产生冲突。因为超过一个trait使用了相同的签名:

	trait Car {
	  def drive() { ... }
	}

	trait Bike {
	  def drive() { ... }
	}

	class DrivingThing implements Car, Bike { ... }

在这种情况下,只有后一个trait定义生效。(本例中Bike生效)。

总结

trait是一个非常有用的概念,很开心在Groovy中看到它。Groovy混合trait是在编译期,因此,Java可以调用trait(Other than Groovy mixins traits work at compile time and can therefore be accessed from Java code)。进一步学习,我推荐Groovy 2.3的Trait 文档

关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看