如何绕过多重继承

时间:2013-02-02 21:03:48

标签: c# inheritance interface abstract-class multiple-inheritance

我正在尝试在C#中实现以下内容,以便我可以强制在父类中初始化某些事件委托和变量,或者我会使用接口。显然下面的语法不正确。

具体课程是Class1&第2课。

这个想法在这里MyClass是一个按钮,它是一个图像,它是别的东西。

编辑:“我理解可选择的和其他的不是对象而是状态。我真正想做的是编写在适当的方法中维护可选状态的代码,因为它将是对于所有这些都是一样的。即在点击事件(点击位置)上检查我是否是基于我的边界框点击,更新状态到选中。我在XNA,这是ac #polling环境,我正在尝试制作如果有意义的话,GUI作为事件驱动?“

 public abstract class Class1
    {
        private int NumberNeededForMethod;

        private void methodThatOccursWhenEventHappens(int NumberNeededForMethod)
        {
            // stuff using NumberNeededForMethod;
        }

        private Class1(int NumberNeededForMethod)
        {
            MethodDelegate += methodThatOccursWhenEventHappens(int
            NumberNeededForMethod)
            ;
        }
    }


public abstract class Class2
    {
        private int NumberNeededForMethod2;

        private void methodThatOccursWhenEventHappens2(int NumberNeededForMethod2)
        {
            // stuff using NumberNeededForMethod2;
        }

        Class2(int NumberNeededForMethod2)
        {
            MethodDelegate += methodThatOccursWhenEventHappens(int NumberNeededForMethod2);
        }
    }

public class ClassThatIsBothClass1andClass2: Class1, Class2
{
    ClassThatIsBothClass1andClass2( int NumberNeededForMethod1, int NumberNeededForMethod2) : Class1(NumberNeededForMethod1),Class2(NumberNeededForMethod2)
    {

    }
}

2 个答案:

答案 0 :(得分:2)

您可以使用合成来创建一个包装class1和class2的类,它是响应按钮引发的事件的东西。

答案 1 :(得分:2)

首先,当然,C#支持多重继承,因此您实现的任何多态性都必须使用接口和组合来完成。

参考this comment 可拖动 可选择 Ownable 是对象的属性

图片 按钮 ,另一方面,对象。

按钮不能 可拥有。

但是按钮可以 可拥有,可拖动或可选择。我想知道这些属性是不只是单个IAshtonControl接口上的属性?

按钮可以想象也是一个图像。这很有道理。

由于C#缺少多重继承,因此您无法创建从AshtonButtonButton基类派生的Image类。

可以做的一件事是创建一个实现AshtonButton接口的IAshtonControl类,该接口的实现可以委托给一个worker类的私有实例这对所有IAshtonControl个实例都有共同作用。

或者,如果需要,您可以使用单独的IOwnableIDraggableISelectable接口。

无论哪种方式,都可以如实地表达AshtonButtonIAshtonControl,可拥有,可拖动,可选择的陈述。这些东西对于不同的控件可能有不同的含义(不同的行为/视觉效果),或者它们可能没有,但是你会隐藏接口背后的那些实现细节,这样你就可以用相同的方式以编程方式处理每个对象,而不管它的实现如何

将对象与其属性分开很重要,因为这会影响您对问题的思考方式。 Draggable 不是一件事,它是一件事的特征。

但如果您的目标是Button也是Image,那么某种类型的合成或委派就是实现这一目标的方法。如果您有IAshtonImage接口,那么您将在AshtonImage类和AshtonImageButton类上实现该接口。然后,您在AshtonImage类中拥有AshtonImageButton类的内部实例(组合),并将对IAshtonImage成员的调用委托给私有(组成)AshtonImage实例,等等。