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

y3bcpkx1  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(279)

我有多个扩展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()。我创建了一个静态helper类,然后由notifyerror()调用。我的所有视图都有在其notifyerror()方法中调用helper类的代码。我觉得这种冗余是不对的。
有没有更好的方法来实现这一点?如果有人对这个需求感到好奇,这里是:如果我的任何子视图出现错误,我希望递归地通知所有父视图该错误(直到我们到达视图层次结构中最顶层的父视图)。所有父母对每个孩子都有相同的错误处理逻辑。
编辑:根据注解,让我为notifyerror()方法共享一个简化的错误处理逻辑:

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

jexiocij1#

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

hujrc8aj

hujrc8aj2#

因为java不支持多重继承,所以必须使用接口。
可能的重复:如何从java中的多个基类继承?
所以你的计划应该是好的。

相关问题