2013-06-26 73 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