【发布时间】: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()方法来自ViewParent,ViewGroup实现了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!!!