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
}

は(のスーパークラス)editsの保護されたフィールドであることに注意してください。そのフィールドを読み取る同じ名前のパブリックアクセサーが欲しいのですが。どうすればいいですか?CompoundEditUndoManager

<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]]
}

これは醜いですが、ネストすることで2つの呼び出しを明確にすることもできます。

class PreFoo extends javax.swing.undo.UndoManager {
  protected def editz = edits
}
class RealFoo extends PreFoo {
  def edits() = editz
}

ただし、フィールド自体と競合しない限り、は必要です(そして、をオーバーライドする()ことはできません)。valdef

于 2013-03-23T21:39:42.363 に答える
1

継承されたフィールドの可視性を変更することはできません。これは許可されていません。

場合によっては、compositionを使用してそのような動作を「シミュレート」することはできますが、CompoundEditクラスを明らかに実装することはできません。

このメソッドはクラスに存在しないため、「editToBeUndone」についてはよくわかりません:http: //docs.oracle.com/javase/6/docs/api/javax/swing/undo/CompoundEdit.html

于 2013-03-23T20:54:11.343 に答える