【问题标题】:Making a public accessor from an inherited protected Java field从继承的受保护的 Java 字段创建公共访问器
【发布时间】:2013-03-13 13:58:23
【问题描述】:

我怎样才能使以下工作:

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
}

请注意,editsCompoundEditUndoManager 的超类)中的受保护字段。我想要一个读取该字段的同名公共访问器。我该怎么做?

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

【问题讨论】:

    标签: java scala inheritance visibility


    【解决方案1】:

    嗯,总会有反思。

    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
    }
    

    不过,您确实需要 (),否则它会与字段本身冲突(并且您不能用 def 覆盖 val)。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 对不起,editToBeUndoneUndoManager 中(这是我实际扩展的类)。反正。由于我可以添加一个名为edits 的方法,我只是想知道,有没有什么技巧可以通过一些限定来引用字段edits,而不是尝试super.edits
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 2011-01-17
      • 1970-01-01
      • 2018-08-23
      • 2015-05-16
      • 2012-08-19
      • 1970-01-01
      相关资源
      最近更新 更多