4
public class SuperClass {
    public void doFoo() {
        //...
    }
}

public class SubClass extends SuperClass implements AnInterface {}

public interface AnInterface {
    public abstract void doFoo();
}

为什么不必SubClass实现该doFoo()方法?我想这是因为它已经在它的超类中了。但我不能@OverridedoFoo(). SuperClass所以有阴影吗?或者那叫什么?这是一个好的/正常的做法吗?

4

3 回答 3

1

一般来说,你所做的并没有错。子类继承doFoo父类的方法,从而满足接口的要求。

如果您希望您的代码过于清晰(可能有助于将来的维护),一种选择是:

public class SubClass extends SuperClass implements AnInterface {

  @Override
  public void doFoo() {
    super.doFoo();
  }
}

我不确定您的原始问题是否有特定术语。也许“有点混乱的继承”?

于 2013-06-26T14:54:42.773 回答
1

为什么 SubClass 不必实现 doFoo() 方法?

因为它已经在SuperClass.

但是我不能在 SuperClass 中为 doFoo() 方法添加 @Override。

不,你不能,因为SuperClass没有实现AnInterface. 它不会覆盖任何人的方法。

所以有阴影吗?

不。阴影是另一回事。它关注变量。因此,如果SuperClass有一个变量foo,并且在SubClass您尝试定义一个具有相同名称的变量,那将是shadowing。这没有名字。

这是一个好的/正常的做法吗?

这是正常的做法。我在许多大型项目中多次看到它。



TLDR 示例如下

假设我们有一个实现 a 所需的接口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
        });
    }
}
于 2013-06-26T14:55:52.467 回答
0

这就是接口的使用方式。当您实现一个接口时,该类的所有变化是您需要在您的类中具有由该接口定义的方法。

要使代码正常工作,您所要做的就是doFoo()在子类中调用一个空方法。

于 2013-06-26T14:55:08.000 回答