2017-05-22 104 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中找到 –