scala - 继承

Val*_*rin 2 inheritance scala

知道我怎么能避免这些重复的类参数?

abstract class XClass(  var x:  Int, var y:  Int, var w:  Int, var h:  Int) {...}
abstract class MXClass( var xS: Int, var yS: Int, var wS: Int, var hS: Int) 
                        extends XClass (xS, yS, wS, hS)
class PXClass( var xP: Int = 0, var yP: Int = 0, var wP: Int = 0, var hP: Int = 0) 
                extends MXClass (xP, yP, wP, hP)
def draw(g: Graphics2D) {
g fillRect (x, y, w, h)
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个这样的东西GUI:

  g setColor black
  val cc = new PXClass(200, 300, 10, 10)
  cc.draw(g)
Run Code Online (Sandbox Code Playgroud)

所以我正在给出那些需要的参数GUI!

谢谢

Eri*_*lun 5

根据你所说的:

XClass是Piece类,MXClass是MovablePiece,然后PXClass是RectanglePiece类.然后我需要通过StationaryPiece扩展Piece类,因此我试图在不同形状的BoardPanel中有一些可移动和整数的部分. - Val 18分钟前

让我们一个接一个地定义它们 - 让我们不要使用任何继承,因为它甚至不需要立即显而易见; 你可以在需要时回到继承(或其他类型的多态),但相信我从来没有真正需要:

sealed trait                  Shape
case object Rectangle extends Shape
case object Square    extends Shape
case object Circle    extends Shape

case class Dimensions(x: Int, y: Int, w: Int, h: Int)

case class Piece(shape: Shape, dim: Dimensions, isMovable: Boolean = true)

val squarePiece =        Piece(Square,    Dimensions(x = 100, y =. 200, w = 20, h = 20))
val circularPiece =      Piece(Circular,  Dimensions(x = 0,   y = -100, w = 40, h = 40))
val immovableRectPiece = Piece(Rectangle, Dimensions(...), isMovable = false)
Run Code Online (Sandbox Code Playgroud)

然后你可以定义一个函数来获取任何一块并绘制它:

def draw(piece: Piece) = piece.shape match {
  case Rectangle => ...
  case Square =>    ...
  case Circle =>    ...
}
Run Code Online (Sandbox Code Playgroud)

...和二进制函数的方法:

case class Piece(...) {
  def collidesWith(other: Piece) = ...
  def overlapsWith(other: Piece) = ...
}
Run Code Online (Sandbox Code Playgroud)

然后:

draw(immovablePiece)

if (piece1 collidesWith piece2) ...

if (piece1 overlapsWith piece2) ...
Run Code Online (Sandbox Code Playgroud)

您也可以自由地创建draw一个方法Piece,但这并不重要 - 如果您设法避免继承,所有方法都会等同于普通函数.

不需要使用继承(即子类型多态); 最好从数学上更纯粹的概念开始,extends完全避免.如果你考虑我已经演示的代码,你会发现它为你提供了一种组合点块而不是提供单片类型的方法; 它还允许您通过为属性提供替代值来将一种类型的片段转换为另一种片段 - 这对于继承是不可能的; 一旦创建,就无法更改对象的类型.

val immovableCirclePiece = circularPiece.copy(isMovable = false)
Run Code Online (Sandbox Code Playgroud)

需要注意的是Shape继承树开始与sealed trait一样的普通的继承-它做什么它定义了一个代数数据类型,在这种情况下颇有渊源这将是一个类似于enumJava中.


此外,您可以尝试提取与绘制/渲染相关的数据,并将其全部放在一个Representation类中,该类同时包含Point绘制特定形状的渲染函数.随意请求澄清 - 有很多话要说,我只是想让你开始以更复杂的方式设计你的程序:)