java – 阴影还是实现?

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
        });
    }
}
点赞