如何进行以下工作:
class Foo extends javax.swing.undo.UndoManager {
// increase visibility - works for method
override def editToBeUndone: javax.swing.undo.UndoableEdit = super.editToBeUndone
// fails for field
def edits: java.util.Vector[javax.swing.undo.UndoableEdit] = super.edits
}
请注意,edits
是CompoundEdit
中的受保护字段(UndoManager
的超类)。我想要一个具有相同名称的公共访问器来读取该字段。我该怎么做?
<console>:8: error: super may be not be used on variable edits
def edits: java.util.Vector[javax.swing.undo.UndoableEdit] = super.edits
^
答案 0 :(得分:2)
嗯,总有反思。
class Foo extends javax.swing.undo.UndoManager {
def edits(): java.util.Vector[javax.swing.undo.UndoableEdit] =
classOf[javax.swing.undo.CompoundEdit].
getDeclaredField("edits").get(this).
asInstanceOf[java.util.Vector[javax.swing.undo.UndoableEdit]]
}
你也可以通过嵌套来消除这两个调用的歧义,尽管这很难看:
class PreFoo extends javax.swing.undo.UndoManager {
protected def editz = edits
}
class RealFoo extends PreFoo {
def edits() = editz
}
您确实需要()
,但不会与字段本身发生冲突(并且您无法使用val
覆盖def
。
答案 1 :(得分:1)
您无法更改继承字段的可见性,这是不允许的。
在某些情况下,您可以通过使用合成来“模拟”此类行为,但您将无法明显实现CompoundEdit类。
不确定'editToBeUndone',因为该方法在类中不存在: http://docs.oracle.com/javase/6/docs/api/javax/swing/undo/CompoundEdit.html