如何在继承链的中间插入类?

3
我有以下类,其中A:B表示A继承自B:
GatewayBaseActivity:SDKBaseActivity:AppCompatActivity

FormsAppCompatActivity:AppCompatActivity
我该如何使一个类拥有GatewayBaseActivity的所有功能,但继承关系如下:
GatewayBaseActivity:SDKBaseActivity:FormsAppCompatActivity:AppCompatActivity
基本上是将FormsAppCompatActivity插入到SDKBaseActivity和AppCompatActivity之间的继承树中。
这些类都来自Xamarin、Android和Airwatch。在不重写一半的类的情况下,最好的方法是什么?

1
如果您使用实际的继承指示符(:)并提供伪代码示例,可能会更有意义。 - maccettura
你需要重新构建已经存在的继承结构。 - Ehsan Sajjad
编写一个继承自“最高”父类的类。在这种情况下,它将是GatewayBaseActivity。如果代码是开源的,您可能可以重新编写一个Activity,以从FormsAppCompatActivity等中扁平化这些结构,使其更简单。这种继承关系过于复杂,具有代码异味。 - Jon Douglas
你可以编写自己的 FormsAppCompatActivity 并将其替换 AppCompatActivity,这样就不需要重写类层次结构的一半,只需修改继承新类的那个类即可。如果你没有 AppCompatActivity 的代码,则无法在它之前插入任何内容,因为你没有权限。 - InBetween
那么我将拥有一个类,比如说GatewayBaseActivityForms:GatewayBaseActivity:SDKBaseActivity:FormsAppCompatActivity:AppCompatActivity。 - jwartofsky
我不确定我是否理解你的问题,但是你不能更改其他库中已定义类的层次结构。但是你可以这样做:不使用is-a关系,而使用has-a关系。这意味着你的类将继承GatewayBaseActivity并具有FormsAppCompatActivity类型的变量。 - Mightee
2个回答

2

考虑以下层次结构:

class A { }
class B: A { }
class D: B { }
class E: D { }

在显而易见的位置插入一个类 C 是相当简单的;你只需要修改 D
class C: B { }
class D: C { }

如果你没有拥有 D 并且无法访问和修改它的实现,则无能为力;你不能改变第三方实现的基类。

1
您建议实现经典的多重继承。在C#(和许多其他语言)中,这种范式应该被声明和实现多个接口所取代。因此,
  • 您可以定义一些通用(适用于您提到的所有类)的抽象接口,并在您想要的类中实现它。

  • 或者您可以为FormsAppCompatActivity定义接口,并在继承链GatewayBaseActivity -> SDKBaseActivity中实现它

但是,工作复杂度和时间量可能会很大,特别是与您所说的“重写一半的类”相比。这强烈取决于您的设计目的。我认为,将外部类注入继承链中的必要性指向了糟糕的设计。因此,我建议考虑设计,并使用接口,如果您确实需要组合这些类的功能。

为了促进组合而非继承 - Mightee

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