【问题标题】:Java:The child class implement interface, but the parent class override the members of the interface?Java:子类实现接口,但父类覆盖接口的成员?
【发布时间】:2017-10-21 21:57:57
【问题描述】:

通常,一个类实现一个接口,该类本身或其子类会覆盖接口中的方法,例如:

定义一个接口:

interface Interface {
    void fun();
}

1.父类重写接口方法,子类直接继承:

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{
}

第三种重写接口方法的方式在android框架源码中很常见,例如:

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()方法来自ViewParentViewGroup实现了ViewParent,但是为什么方法的实现要在父类View中完成?

这样设计的原因是什么?

【问题讨论】:

  • 不应该被允许的原因是什么?
  • 您的第 3 点与您给出的示例不匹配。(父母没有在 Android 示例中实现接口,这是完全正常的)更正您的问题。
  • @pulp_fiction 问题的核心是:子类实现了一个接口,但是超类覆盖了接口的方法。在示例中,重点是 ViewParent、View 和 ViewGroup 之间的关系。这种相对关系符合第三种设计模式。
  • 恐怕你的例子在上下文中是错误的!甚至不是你所说的相对关系。见:public class View extends Object implements 这里:developer.android.com/reference/android/view/View.html
  • 如你所见,View extends Object!!!

标签: java android interface


【解决方案1】:

嗯,每个View 都有一个父View,所以基类View 需要一个getParent() 方法并有一个mParent 属性。

但是,View 没有实现 ViewParent,因为并非所有视图都是其他视图的父视图。

如果View 正在实现一些基本的“ViewInterface”,则可以在该接口中包含getParent(),但由于没有,getParent() 被包含在ViewParent 接口中。

由于View 已经实现了该方法,ViewGroup 子类不必实现它。

【讨论】:

  • 您的答案与他发布的示例有关。真正的问题是,为什么像Parent implements InterfaceBase extends Parent implements Interface 这样的模式是可以接受的?这也可以在标准 Java API 中找到
猜你喜欢
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多