Java:子类实现接口,但父类重写接口成员?

3

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

定义一个接口:

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() 来自于 ViewParent,而 ViewGroup 实现了 ViewParent 接口,但是为什么方法的实现却在父类 View 中进行呢?
这样设计的原因是什么?

为什么不允许它的原因是什么? - user207421
你的第三点与你给出的示例不符。(在Android示例中,父类没有实现接口,这是完全正常的)请修正你的问题。 - Manish Kumar Sharma
@pulp_fiction 问题的核心是:子类实现了一个接口,但是父类覆盖了接口的方法。在这个例子中,重点关注ViewParent、View和ViewGroup之间的关系。这种相对关系与第三种设计模式一致。 - kangjianwei
@pulp_fiction 哦,Java中每个对象都继承自Object类。因此,在javadoc文档中,会存在“extends Object”。但在源代码中,“extends Object”通常被省略。您可以查看源代码:https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/View.java。此外,Object类不会影响上述提到的关系。 - kangjianwei
但是接口不会扩展Object。你的层次结构涉及一个公共接口。基类和子类都扩展该接口。在Android示例中,View不实现ViewParent接口!请仔细查看后再发表评论! - Manish Kumar Sharma
显示剩余3条评论
1个回答

0

每个 View 都有一个父 View,因此基础的 View 类需要一个 getParent() 方法和一个 mParent 属性。

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

如果 View 实现了一些基本的 "ViewInterface",那么就可以在该接口中包含 getParent(),但由于它没有,所以 getParent() 被包含在 ViewParent 接口中。

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


你的答案围绕他发布的示例。真正的问题是,为什么像“Parent implements Interface”和“Base extends Parent implements Interface”这样的模式是可以接受的?这也可以在标准Java API中找到。 - Manish Kumar Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接