从继承的受保护的 Java 字段创建公共访问器
Posted
技术标签:
【中文标题】从继承的受保护的 Java 字段创建公共访问器【英文标题】:Making a public accessor from an inherited protected Java field 【发布时间】: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
请注意,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
^
【问题讨论】:
【参考方案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
【讨论】:
对不起,editToBeUndone
在UndoManager
中(这是我实际扩展的类)。反正。由于我可以添加一个名为edits
的方法,我只是想知道,有没有什么技巧可以通过一些限定来引用字段edits
,而不是尝试super.edits
。以上是关于从继承的受保护的 Java 字段创建公共访问器的主要内容,如果未能解决你的问题,请参考以下文章