如何将可重用逻辑添加到已经扩展另一个的类中?

时间:2016-05-10 00:45:41

标签: java android design-patterns

我有多个视图扩展Android框架类:

class A extends ImageView     // ImageView extends android.View

class B extends TextView      //TextView extends android.View

class C extends LinearLayout     //LinearLayout extends android.ViewGroup which extends android.View

我有一个可以应用于android.view

的操作
void notifyError(){
  getParentView().notifyError()     //I have type checks on getParentView()
}

上述方法是其中一种方法的过度简化版本。重要的是:

  1. 所有视图都应该有一个notifyError()方法
  2. notifyError中的代码与所有视图完全相同
  3. 理想情况下,我应该有一个抽象类,所有视图都可以扩展。我本可以在抽象类中给出notifyError()的基本实现,并且一切都很好。但是这个解决方案超出了范围,因为视图不能从多个类扩展。

    我目前的解决方案是让我的所有视图都实现一个接口,这会强制所有视图覆盖notifyError()。我创建了一个静态助手类,然后由notifyError()调用。我的所有视图都有代码在notifyError()方法中调用helper类。这种冗余对我来说不合适。

    有没有更好的方法来实现这一目标?如果有人对这个要求感到好奇,那么它就是:如果我的任何一个子视图都出错了,我想以递归方式通知所有父视图错误(直到我们到达视图层次结构中最顶层的父视图)。所有父母对每个孩子都有相同的错误处理逻辑。

    编辑:根据评论,让我分享一下notifyError()方法的简化错误处理逻辑:

    void notifyError(Exception e){
      Log.e(TAG, e.getMessage());
      getParentView().notifyError(e);
    }
    

2 个答案:

答案 0 :(得分:0)

由于Java不支持多继承,因此必须使用接口。

可能重复:How to inherit from multiple base classes in Java?

所以你的实现接缝很好。

答案 1 :(得分:0)

Java 8接口中的默认方法似乎解决了这个问题。虽然,我不能使用Java 8,除非我将我的最低支持Android版本移动到24;这种方法在支持Java 8的平台上是正确的方法。因此,将此答案标记为已接受。