2013-03-19 4 views
4

Рассмотрим следующий пример: контурЧлен затенения в подклассе

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() 
} 

Мой вопрос о линии «ААА». Цель здесь состоит в том, чтобы избежать необходимости использовать член контекста, унаследованный от суперкласса, каждый раз, когда он ссылается. Другими словами, я бы скорее

context.additionalMethod() 

вместо

((SomeBar)context).additionalMethod() 

каждый раз.

Этот подход, похоже, работает, но мне интересно, правильно ли оно, или если есть какие-то проблемы с выполнением чего-то подобного. В моем случае это не привело бы к двусмысленности, хотя я мог видеть, как это может быть в целом.

Кроме того, я просто хочу убедиться, что я не создаю здесь новый объект, но, скорее, методы интерпретируют ссылочный элемент context по-разному.

Я полагаю, что альтернативой было бы переименование context на что-то вроде rawContext, что может быть предпочтительнее.

Заранее спасибо

+0

У вас есть 'метод additionalMethod' в' IBar'? – Apurv

+0

@Apurv: no, 'extraMethod' не находится в' IBar'. – jedwards

ответ

4

Это классический случай для использования дженериков:

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

Тогда

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

Woah, этот подход - это глазник. Благодарю. – jedwards

Смежные вопросы