当前位置: 首页 > 编程语言 > C#

MultipleInheritanceWithoutMultipleInheritanceandNoCodeDuplication分享

时间:2023-04-10 13:42:48 C#

MultipleInheritanceWithoutMultipleInheritanceandWithoutCodeDuplication我有一个理论上的问题,关于如何在不允许多重继承的语言中处理以下场景。假设我有一个基类Foo,我希望从中创建三个子类:假设实现函数“A”和“B”的代码始终相同。有没有办法只为“A”和“B”编写一次代码,并让相应的类应用(或“继承”)它?好吧,我认为您在C#/Java中实现此目标的唯一方法是通过组合。考虑:classFoo{}interfaceA{publicvoida();}接口B{publicvoidb();}类ImplA实现A{@Overridepublicvoida(){System.out.println("a");}}类ImplB实现B{@Overridepublicvoidb(){System.out.println("b");}}类Bar扩展Foo{Aa=newImplA();publicvoida(){aa();}}classBazextendsFoo{Bb=newImplB();publicvoidb(){bb();}}classQuxextendsFoo{Aa=newImplA();Bb=新的ImplB();publicvoidb(){bb();}publicvoida(){aa();现在Qux不仅通过正常的继承实现了Foo的功能,还通过组合实现了A和B的实现。更通用的术语是Mixin。有些语言提供了开箱即用的支持,例如Scala和D。但是在其他语言中有多种方法可以达到相同的结果。在C#中创建伪混合的一种方法是使用空接口并为这些方法提供扩展方法。interfaceA{}staticclassAMixin{publicstaticvoidaFunc(thisAinst){...//为所有A工作的实现。}}interfaceB{}staticclassBMixin{publicstaticvoidbFunc(thisBinst){...}}classQux:Foo,A,B{...}这在提供特征的语言中是可能的(这里:scala):classFoo{deffooM(){}}traitA{defaFunc(){}}traitB{defbFunc(){}}classBarextendsFoowithA{}classBazextendsFoowithB{}classQuxextendsFoowithAwithB{}因为Scala运行在Java之上(既不是多个inheritancenortraits),它转换成这样的东西(简化)——这可能是一个提示如何在Java/C#中手动实现它:classFoo{}interfaceA{voidaFunc();}接口B{voidbFunc();}classBarextendsFooimplementsA{publicvoidaFunc(){$A.aFunc();}}classBazextendsFooimplementsB{publicvoidbFunc(){$B.bFunc();}}classQuxextendsFooimplementsA,B{publicvoidaFunc(){$A.aFunc();}publicvoidbFunc(){$B.bFunc();}}class$A{publicstaticvoidaFunc(){}}class$B{publicstaticvoidbFunc(){}}有几种方法可以做这样的事情。更具体地说,如果我们暂时放弃继承方面,有很多方法可以将相同的功能单元引入不同的类,只需编写一次该单元。好吧,我喜欢AOPFrameworks,它们存在于多种语言中(C#和Java有几种)。AOP框架基本上允许您在整个继承结构中向不同的类添加独立的功能。对于C#,您有PostSharp和Java,还有AspectJ和许多其他语言。许多AOP框架允许在不使用继承的情况下“劫持”或“覆盖”方法调用。以上就是C#学习教程的全部内容:没有多重继承,没有代码重复,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢