2013-03-23 66 views
3

公共访问我怎样才能让下面的工作:使从继承保护的Java字段

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 
                      ^

回答

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 
} 

你需要(),虽然 - 没有它与字段本身冲突(你可以”使用def覆盖val)。

1

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

在某些情况下,您可以通过使用合成来“模拟”这种行为,但您无法明显地实现CompoundEdit类。

不知道关于“editToBeUndone”作为此方法不会在类存在: http://docs.oracle.com/javase/6/docs/api/javax/swing/undo/CompoundEdit.html

+0

对不起,'editToBeUndone'在'UndoManager'中(这是我实际扩展的类)。无论如何。由于我可以添加一个名为'edits'的方法,我只是想知道,是否有任何技巧通过某种限定来引用'edits'字段,而不是尝试'super.edits'。 – 2013-03-23 20:59:10