成员在子类中的阴影

时间:2013-03-19 06:30:29

标签: java inheritance shadowing

考虑以下示例大纲:

interface IBar{ /*...*/ }

class SomeBar implements IBar { /*...*/ }

abstract class AbstractFoo
{
    IBar context;

    /* Some default implementations of methods manipulating 'context' */
}

class SomeFoo extends AbstractFoo
{
    final SomeBar context = (SomeBar)super.context;       // <-- AAA

    /* Some methods that reference additional non-IBar methods. */

    // The line AAA allows us to use:
    //      context.additionalMethod()
    // instead of
    //      ((SomeBar)context).additionalMethod()
}

我的问题是关于“AAA”行。这里的目标是避免每次引用时都必须转换从超类继承的上下文成员。换句话说,我宁愿

context.additionalMethod()

而不是

((SomeBar)context).additionalMethod()

每一次。

这种方法似乎有效,但我想知道它是否正确,或者做这样的事情是否有任何问题。就我而言,这不会导致含糊不清,尽管我可以看到它的一般情况。

另外,我只是想确保我不是在这里创建一个新对象,而是让方法以不同的方式解释context引用成员。

我认为另一种方法是将context重命名为rawContext,这可能更合适。

提前致谢

1 个答案:

答案 0 :(得分:4)

这是使用泛型的经典案例:

abstract class AbstractFoo<T extends IBar>
{
    protected T context;
    // some default impl
}

然后

class SomeFoo extends AbstractFoo<SomeBar> 
{
    // access context directly as type SomeBar
}