Java 如何向已经扩展了另一个类的类添加可重用逻辑?

Java 如何向已经扩展了另一个类的类添加可重用逻辑?,java,android,design-patterns,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框架类的视图:

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()
}
上述方法是其中一种方法的过度简化版本。重要的部分是:

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

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

    有没有更好的方法来实现这一点?如果有人对这个需求感到好奇,那么就是:如果我的任何子视图出现错误,我希望递归地通知所有父视图该错误(直到我们到达视图层次结构中最顶层的父视图)。所有家长对每个孩子都有相同的错误处理逻辑

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


    因为Java不支持多重继承,所以必须使用接口

    可能重复:


    因此,您的实现应该是好的。

    因为Java不支持多重继承,所以您必须使用接口

    可能重复:



    因此,您的实现应该是好的。

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

    Java 8接口中的默认方法似乎可以解决此问题。尽管如此,我不能使用Java8,除非我将支持的最低android版本改为24;在支持Java8的平台上,这种方法是正确的。因此,将此答案标记为已接受。

    我认为抽象类没有问题。您可以让抽象类扩展android.View,视图扩展抽象类。否则,我不知道您的Android版本是否允许使用Java8,但请注意,在Java8中,接口可以有默认(具体)方法。最后,当继承不起作用时,下一个选项通常是compositionImageView、TextView等,它们是框架提供的类,具有许多逻辑,我无法自己编写。直接扩展视图是一场噩梦!哦,好吧,我还以为是你呢
    getParentView
    来自哪里?我在
    View
    的文档中没有看到它(仅
    getParent
    )对不起,为了清楚起见,我提到了getParentView()。我假设不是每个人都理解getParent()。我看不出抽象类有什么问题。您可以让抽象类扩展android.View,视图扩展抽象类。否则,我不知道您的Android版本是否允许使用Java8,但请注意,在Java8中,接口可以有默认(具体)方法。最后,当继承不起作用时,下一个选项通常是compositionImageView、TextView等,它们是框架提供的类,具有许多逻辑,我无法自己编写。直接扩展视图是一场噩梦!哦,好吧,我还以为是你呢
    getParentView
    来自哪里?我在
    View
    的文档中没有看到它(仅
    getParent
    )对不起,为了清楚起见,我提到了getParentView()。我想不是每个人都能理解getParent()。听起来像是一个评论而不是答案,加上他已经有了一个interfaceAgree,我想,他真的不能更好地回答当前的问题,不:p但也许像评论而不是答案这样问问题是错误的,加上他已经有了一个interfaceAgree,我想,他现在的问题不可能做得更好,不:p,但也许这个问题问错了
    void notifyError(Exception e){
      Log.e(TAG, e.getMessage());
      getParentView().notifyError(e);
    }