3

我怎样才能使以下工作:

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
}

请注意,这editsCompoundEdit(的超类UndoManager)中的受保护字段。我希望有一个同名的公共访问器来读取该字段。我该怎么做?

<console>:8: error: super may be not be used on variable edits
         def edits: java.util.Vector[javax.swing.undo.UndoableEdit] = super.edits
                                                                            ^
4

2 回答 2

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用 a 覆盖 a def)。

于 2013-03-23T21:39:42.363 回答
1

您不能更改继承字段的可见性,这是​​不允许的。

在某些情况下,您可以通过使用组合来“模拟”此类行为,但显然无法实现 CompoundEdit 类。

不确定“editToBeUndone”,因为该方法在类中不存在:http: //docs.oracle.com/javase/6/docs/api/javax/swing/undo/CompoundEdit.html

于 2013-03-23T20:54:11.343 回答