3

次のアウトラインの例を検討してください。

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が、これが望ましいかもしれません。

前もって感謝します

4

1 に答える 1

4

これは、ジェネリックを使用するための典型的なケースです。

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

それで

class SomeFoo extends AbstractFoo<SomeBar> 
{
    // access context directly as type SomeBar
}
于 2013-03-19T06:36:31.930 に答える