本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!