2013-06-26 41 views
4
public class SuperClass { 
    public void doFoo() { 
     //... 
    } 
} 

public class SubClass extends SuperClass implements AnInterface {} 

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

为什么​​不得不实施doFoo()方法?我想这是因为它已经在它的超类中。但是我不能在SuperClass中为doFoo()方法添加@Override。所以它被遮蔽了?或者那叫什么?这是一种很好的/正常的做法吗?有影响或实施?

回答

1

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

因为它已在SuperClass中实施。

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

不,您不能,因为SuperClass不执行AnInterface。它不会覆盖任何人的方法。

所以它被遮蔽了?

编号影子是别的。它关注变量。因此,如果SuperClass的变量为foo,并且​​您尝试定义一个具有相同名称的变量,那就是shadowing。这没有名字。

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

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



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 
     }); 
    } 
} 
1

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

如果你想你的代码过于清楚(也许是为了在未来保持支持),其中一个方案是:

public class SubClass extends SuperClass implements AnInterface { 

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

我不知道有你原来的问题一个特定术语。也许“轻度混淆遗传”?

0

这是如何使用接口。当你实现一个接口时,关于这个类的所有改变都是你需要在你的类中有由该接口定义的方法。

您需要做的只是让您的代码工作,在您的子类中放入一个名为doFoo()的空方法。

+0

代码也可以不把)称为doFoo(空方法 – GarfieldKlon

+0

那么这意味着它继承'doFoo()'自其超和符合标准履行接口@GarfieldKlon – Stephan