2017-10-28 57 views
0

我是scala的新手,我正在尝试创建一个代码尚未完成的树。这是我做了什么:如何解决scala中“实现特征成员”的错误

class Tree { 

class TreeNode(val n: Int, val points: Array[Double], 
     val center: Double) extends Tree{ 
} 
sealed trait Tree { 
def elem : TreeNode 
} 

def buildTree(points: Array[Double], m: Int): Tree = { 
    val center = points(Random.nextInt(points.length)) 
    val root: Tree = new TreeNode(points.length, points, center) 

    println("center is : " + center) 
    printNode(root.elem) 
    root 
} 
} 

,我收到以下错误:

class TreeNode must either be declared abstract or implement abstract member elem

我该怎么办?在此先感谢

回答

0

您发布的代码不仅有点困惑。扩展Tree

sealed trait Tree { 
    def elem : TreeNode 
} 

任何需要定义一个TreeNode,我们会打电话给elem。我们不需要在这里定义它,因为这是一个特点。

class TreeNode(. . .) extends Tree {} 

所以一个TreeNode延伸Tree,这意味着一个TreeNode的每个实例都需要TreeNode类型的elem。但我们正在定义什么是TreeNode。我们如何提供与我们定义的相同的东西?我只能想到一个解决方案。

class TreeNode(. . .) extends Tree {def elem = this} 

elem现在有什么用途? TreeNode的每个实例都有一个成员elem,这只是对其自身的引用。如果你有一个TreeNode,沿着val tn = new TreeNode(...)tn.elem与是一样的东西。


此外,为什么这一切都在class Tree?这意味着您必须有Tree才能构建Tree#Tree

val tree: Tree = new Tree 
val tt: Tree#Tree = tree.buildTree(...) 

这一切都很困惑。

+0

你能提出一个更简单的实现吗?该答案非常有用谢谢 –

+0

在StackOverflow上,有用的答案被增加和/或标记为“已接受”。至于更简单的实现,为什么要尝试定义'Tree'?树只是连接节点的集合。在创建节点并连接它们之后,树与您的根节点相同。 – jwvh

0

酷似你的错误消息说,你可以声明类是抽象

abstract class TreeNode(val n: Int, val points: Array[Double], 
         val center: Double) extends Tree{ 
} 

或实现方法

class TreeNode(val n: Int, val points: Array[Double], 
       val center: Double) extends Tree{ 
    override def elem: TreeNode = ??? // write here your implementation instead of "???" 
} 

对不起,我是船长显而易见的。

+0

,所以如果我想在我与buildTree主类,以创建一个新的节点功能的ELEM方法应该是:覆盖高清ELEM:树节点= { VAL节点=新的TreeNode(N,分,中锋) 节点} –

+0

@ SuzyTros是的,例如。或者你可以这样写:'override def elem:TreeNode = new TreeNode(n,points,center)'。 –

相关问题