C#中多重继承的替代解决方案的最佳实践是什么?

时间:2010-06-16 16:03:49

标签: c# oop inheritance

我有一些类继承自现有的Windows控件,如TextBox和DateTimePicker,.. etc

我想为这些类添加自定义功能,例如(Read,Alert,...等) 这些附加功能在所有这些类中都是相同的

问题是:这些类继承自不同的父类,所以我不能在父类中添加我的功能,

在这种情况下,最佳做法是什么:

  • 重复每个继承的代码 类

  • 使用分离的类有 功能作为静态方法 使用来自接口的参数,为类实现此接口 然后通过他们。

  • 使用分离的类,如第二种方法,但使用Dynamic参数(在C#4.0中添加)

    或其他!!

提前致谢

4 个答案:

答案 0 :(得分:12)

我会考虑选项4:组合。

首先,定义您的功能集。我们假设您的部分列表是独占的,因此“读取”和“警报”。

其次,创建一个实现此功能的类,如MyCommonControlBehaviors。我希望这个实现尽可能不是静态的,但它可能是通用的。

public MyCommonControlBehaviors
{
    public Whatever Read() { /* ... */ }
    public void Alert() {}
}

第三,使用组合将此类的实例添加到每个自定义控件类型,并通过自定义控件公开该功能:

public class MyCustomControl
{
    private MyCommonControlBehaviors common; // Composition

    public Whatever Read() { return this.common.Read(); }
    public void Alert() { this.common.Alert(); }
}

根据具体情况,您可以获得必要的创意。例如,您的自定义行为可能需要与私有控制数据进行交互。在这种情况下,请使您的控件实现一个常见的ICommonBehaviorHost接口,以满足您的常见行为需要。然后将控件作为ICommonBehaviorHost的实例传递给构造中的行为类:

public interface ICommonBehaviorHost
{
    void Notify();
}

public class MyCommonControlBehaviors
{
    ICommonBehaviorHost hst = null;

    public MyCommonControlBehaviors(ICommonBehaviorHost host) 
    {
        this.hst = host;
    }

    public void Alert() { this.hst.Notify(); }  // Calls back into the hosting control
    // ...
}

public class MyCustomControl : ICommonBehaviorHost
{
    private MyCommonControlBehaviors common = null;

    public MyCustomControl() { common = new MyCommonControlBehaviors(this); }
    public Whatever Read() { return this.common.Read(); }
    public void Alert() { this.common.Alert(); }

    void ICommonBehaviorHost.Notify() { /* called by this.common */ }
}

答案 1 :(得分:6)

答案 2 :(得分:1)

如果必须,我可能会做的是为每个类创建扩展方法,然后在所有扩展方法可以调用的其他对象中引用这些所需的实际编码。

这样代码不会重复,扩展方法使得它看起来应该在对象中。

基本上通过创建静态方法并执行:Functions.DoSomething(my_Object);

但我总是喜欢:my_Object.DoSomething()更好的OO语言。

答案 3 :(得分:0)

我建议为行为定义一个接口,然后(不要重复自己)在共享方法的接口定义上创建扩展方法。 (有点像你的第二个选择,只有扩展方法而不是完全静态的方法)。