给出以下父类:
public class AbstractParent<T> {
abstract protected void doSomething();
}
和以下子类:
public class DelegatingChildClass<T,U> extends AbstractParent<T> {
AbstractParent<U> delegate;
public DelegatingChildClass(AbstractParent<U> delegate) {
this.delegate = delegate;
}
@Override
protected void doSomething() {
delegate.doSomething();//<--- Problem line
}
}
我对受保护方法的理解是访问仅限于:
由于DelegatingChildClass扩展了AbstractParent,所以我期望可以访问委托的doSomething()方法。但是,编译器抱怨它具有受保护的访问。这是编译器错误吗?还是我对受保护的访问修饰符应该如何工作有误解?
答案 0 :(得分:0)
“扩展声明类的类”意味着您可以沿着该对象的扩展层次结构访问同一对象(this
)的超类中的方法。类型DelegatingChildClass<T,U>
的对象也是类型AbstractParent<T>
的对象,因此在DelegatingChildClass<T,U>
的代码中,您可以对同一对象使用AbstractParent<T>
的方法。这将允许super.doSomething()
,但是在这里没有意义,因为super.doSomething()
是abstract
。
使用delegate
不可能在这里调用doSomething()
,因为类型DelegatingChildClass<T,U>
的对象不会在此处扩展变量delegate
中的对象。这种用法称为组合,而不是扩展。