在不使用多重继承的情况下避免代码重复

Posted

技术标签:

【中文标题】在不使用多重继承的情况下避免代码重复【英文标题】:Avoiding code repetition without using multiple inheritance 【发布时间】:2013-01-02 06:28:46 【问题描述】:
class A : N

     void sinefunc()
     
           //some stuff here
     


class B : N


    void sinefunc()
    
        //some stuff here
    


class C : N
 
    void sinefunc()
    
         //some stuff here
    

sinefunc() 是一个常用函数。但是,A、B 和 C 类存在于不同的 解决方案下的项目。这些类已经继承了一个公共类 N,现在,

    为避免代码重复,sinefunc() 可以移到这些类之外。 但是,由于不允许多重继承。什么是有效的方法或 使功能通用的可行方法? (请注意,我不想把sinefunc() 在 N 班。它已经写好了,我不想打扰那个班。

【问题讨论】:

【参考方案1】:

(请注意,我不想将 sinefunc() 放在 N 类中。它的 已经写好了,我不想打扰那堂课)

如果不将函数移至 N 类,则无法这样做。您可以拥有一个具有方法签名的接口,但是您必须在每个类中定义实现。

一种方法是为类N编写一个扩展方法,您可以在继承的类中使用它。

编辑:

定义一个静态类来保存扩展方法,例如:

public static class ExtensionClass

    public static void sinefunc(this N obj)
    
        // your code
    

以后你可以这样称呼它:

static void Main(string[] args)

    A objA = new A();
    objA.sinefunc();

记住要包含保存扩展方法的命名空间,否则它将不可见。您可以阅读更多信息:Extension methods MSDN

【讨论】:

扩展方法是在不更改 N 的情况下将函数添加到 N 的多个子类的“C#onic”方式。也就是说,如果您有多个具有相同功能的子类,它似乎真的将其移入 N是正确的做法。 感谢您告诉我扩展方法 Habib。这里很新。一些代码示例将不胜感激。 感谢 Habib.. 这很有帮助。现在正在尝试实施。【参考方案2】:

您可以创建一个中间类作为N 的外观:

class A : X     

class B : X     

class C : X     

class X : N

     protected void sinefunc()
     
           //some stuff here
     

【讨论】:

你的意思是多级继承? 谢谢你的另一种方式!【参考方案3】:

如果 sinefunc() 是一个普通函数,你为什么不把它放到另一个类中。例如,您可以在 Utility 类中将其设为静态方法

【讨论】:

以上是关于在不使用多重继承的情况下避免代码重复的主要内容,如果未能解决你的问题,请参考以下文章

重构以避免在使用抽象类而不是接口时进行多重继承

python多重继承

什么是Mixin

转换为多重继承

多重继承,虚基类

为啥在多重继承的情况下QObject需要是第一个