public class SuperClass {
public void doFoo() {
//...
}
}
public class SubClass extends SuperClass implements AnInterface {}
public interface AnInterface {
public abstract void doFoo();
}
为什么SubClass不必实现doFoo()方法?我想这是因为它已经在它的超类中了.但是我不能在SuperClass中为doFoo()方法添加@Override.它被遮蔽了吗?或者叫什么?这是一个很好/正常的做法吗?
最佳答案
Why does SubClass don’t have to implement the doFoo() method?
因为它已经在SuperClass中实现了.
But I can’t add a @Override for the doFoo() method in SuperClass.
不,你不能,因为SuperClass没有实现AnInterface.它不会覆盖nobody的方法.
So it is shadowed?
不,遮蔽是另一回事.它涉及变量.因此,如果SuperClass有一个可变的foo,并且在SubClass中你尝试定义一个具有相同名称的变量,那将是阴影.这没有名字.
And is this a good/normal practice?
这是正常的做法.我在很多大项目中都看过很多次.
TLDR示例如下:
假设我们有一个实现ModelBasedWizard所需的接口(向导在许多桌面应用程序中很常见).
public interface IModelBasedWizard {
public void addWizardPage(IWizardPage page);
public IStatus getWizardStatus();
public void bindModel(IModel model);
}
假设已经有一个向导的实现
public class Wizard {
public void addWizardPage(IWizardPage page) {
pages.add(page);
page.createContent(this);
}
public IStatus getWizardStatus() {
List<IStatus> stati= new ArrayList<Status>();
for (IWizardPage page : pages) {
stati.add(page.getStatus());
}
return stati;
}
}
现在,这只是向导的一个可视部分,但它对模型一无所知.好的没问题:
public class ModelBasedWizard extends Wizard implements IModelBasedWizard {
//UI, pages, stati and all other functionalities are already implemented.
//I just need to bind this wizard to a model
//create some content here
@Override
public void bindModel(IModel model) {
this.model = model;
this.fieldOne.bindToModel(model);
model.addPropertyChangeListener(new PropertyChangeListener() {
//bla bla
});
}
}