2017-05-22 150 views
1

通常,類實現一個接口,和類本身或它的子類中重寫在接口中的方法,如:Java:子類實現接口,但父類覆蓋接口的成員?

定義的接口:

interface Interface { 
    void fun(); 
} 

1.Parent類重寫接口方法和子類繼承直接:

public class Parent implements Interface{ 
    public void fun(){ 
    } 
} 

public class Child extends Parent{ 
} 

或者:

2.父類被定義爲一個抽象類,子類覆蓋在接口中的方法:

public abstract class Parent implements Interface{ 
} 

public class Child extends Parent{ 
    public void fun(){ 
    } 
} 

不過,我也看到一個奇怪的方法來覆蓋接口方法:

3,子類只能實現接口,但覆蓋在接口中的方法由父類:

public class Parent{ 
    public void fun(){ 
    } 
} 

public class Child extends Parent implements Interface{ 
} 

重寫接口的方法的第三個方法是在機器人框架源代碼很常見的,例如:

public interface ViewParent { 
    //...... 
    void requestLayout(); 
    ViewParent getParent(); 
} 

public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource { 
    //...... 
    @CallSuper 
    public void requestLayout() { 
     //...... 
    } 

    public final ViewParent getParent() { 
     return mParent; 
    } 
} 

public abstract class ViewGroup extends View implements ViewParent, ViewManager { 
    //...... 
} 

的方法requestLayout()的getParent()來自ViewParent,並的ViewGroup實現ViewParent,但爲什麼該方法的實現在父類查看做些什麼呢?

這種設計的原因是什麼?

+0

它不應該被允許的原因是什麼? – EJP

+0

你的第三點與你給出的例子不符(父母沒有在Android例子中實現接口,這是完全正常的)修正你的問題。 –

+0

@pulp_fiction問題的核心是:子類實現一個接口,但超類覆蓋接口的方法。在這個例子中,重點是ViewParent,View和ViewGroup之間的關係。這種相對關係與第三種設計模式一致。 – StrayedKing

回答

0

不錯,每View有父View,所以基View類需要getParent()方法,具有mParent屬性。

但是,View未執行ViewParent,因爲並非所有視圖都是其他視圖的父項。

如果View正在執行一些基本的「ViewInterface」,將有可能包括在接口getParent(),但因爲它沒有,getParent()被列入ViewParent接口。

而且由於View已經實現了該方法,所以ViewGroup子類不必實現它。

+0

你的回答是他發佈的例子。真正的問題是,爲什麼像'Parent implements Interface'和'Base extends Parent implements Interface'這樣的模式是可以接受的?這也可以在標準Java API中找到 –