java traits_使用traits增强java类,如何在java字段中声明内部特征?
发布日期:2021-06-24 12:40:59 浏览次数:2 分类:技术文章

本文共 1482 字,大约阅读时间需要 4 分钟。

是的,它是可行的,但不是试图访问你想要混合的类的私有字段(这很可能是一个坏主意),你会想要将RectangleLike的自我类型声明为java.awt.geom.RectangularShape,以便你可以使用你的特质Ellipse2D.Double与Rectangle2D.Double一样。

下面是它的工作原理:

trait RectangleLike {

self: java.awt.geom.RectangularShape =>

def translate(dx: Double, dy: Double) {

setFrame(getX + dx, getY + dy, getX + getWidth, getY + getHeight)

}

}

object Test {

val foo = new java.awt.geom.Ellipse2D.Double with RectangleLike

}通过说self: java.awt.geom.RectangularShape =>你声明你的特质的自我类型,它允许你访问所有相应的方法,如必要的getter和setter,允许使用你的特征RectangularShape的所有后代,并且还“限制”你的特性,使它只能可以用作混合类,它们本身是RectangularShape的子类型。

上述场景的替代方案是使用所谓的RectangularShape视图,这也是一种常见的范例。为此,您可以例如宣布一个班级

class RichRectangularShape(shape: java.awt.geom.RectangularShape) {

def translate(dx: Double, dy: Double) {

shape.setFrame(shape.getX + dx, shape.getY + dy,

shape.getX + shape.getWidth, shape.getY + shape.getHeight)

}

}Scala有一种隐式查看一种类型的对象作为另一种类型的对象的方法。如果碰巧在未在相应类型中声明的对象上调用方法,则编译器会尝试查找提供此方法的类型,特别是还要尝试查找隐式转换,以便可以将原始对象视为后一种类型的实例。为此,您通常会将RichRectangularShape的伴随对象声明为:

object RichRectangularShape {

implicit def mkRRS(shape: java.awt.geom.RectangularShape): RichRectangularShape =

new RichRectangularShape(shape)

}然后:

scala> import RichRectangularShape._

import RichRectangularShape._

scala> val foo = new java.awt.geom.Ellipse2D.Double

foo: java.awt.geom.Ellipse2D.Double = java.awt.geom.Ellipse2D$Double@0

scala> foo.translate(5,2)

scala> foo.getX

res1: Double = 5.0

scala> foo.getY

res2: Double = 2.0

scala> :t foo

java.awt.geom.Ellipse2D.Double

转载地址:https://blog.csdn.net/weixin_32804237/article/details/114210720 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:ubuntu java 1.6 安装_Ubuntu下安装JDK1.6
下一篇:java directbuffer_Java ByteBuffer isDirect()用法及代码示例

发表评论

最新留言

很好
[***.229.124.182]2024年04月01日 20时32分52秒