2011-07-08 21 views
0

假设我有一堆用于所有控件的代码,但是我需要与我的软件套件进行交互的子类来使用这些常用方法。我真的希望我的子类来自控制,而不是具有通用代码的类。 (MyEdit应该来自编辑,而不是来自MyControl)。另外,该套件使用MyControl派生自的接口与控件进行交互。为了在C++中要做到这一点,我会用多继承,像这样将多重继承更改为从模板派生

class MyEdit : public Edit, public MyControl; 
class MyControl : public IControl; 

然而,我突然发现,如果我想一些控制是C#不支持我不应该使用多继承多inhertiance。 所以我想我能做到这一点...

class MyEdit : public MyControl<Edit>; 
template class MyControl<Type> : public IControl; 

转换共同控制的东西成模板,并给它控制我想从派生的类型。

但是,我不确定这是否会起作用,因为模板模板编辑,但它不一定会创建一个吗?当我创建模板时,我实际上可以创建编辑?

其次,如果这是可能的,是否有可能在C#中?它会是什么样子?

回答

0

我不能说我完全遵循你的问题,但在问候:

但是我不知道这会工作, 因为模板templatizes编辑, 但它不一定创建一个 这样做?当我创建模板 时,我实际上是否能够创建 编辑?

我会去

template<class Controlled_t> 
class MyControl : public Controlled_t, public IControl 
{ 
//My Control inherits from its templated class 
} 

使 MyControl<Edit>继承Edit(这是创建)和接口

+0

看起来不错,但在C#中可能吗? –

0

在C#中,一个类只能从一个其他类继承,但它可以实现多个接口,所以如果您想要一个可以在运行时重写多个多态类型行为的类,则必须使用接口。 Interfaces的缺点是它们没有属性或基本方法实现,因此您可能必须复制实现相同接口的类中的一些方法。

另一种C#方式来获得多态运行时行为是通过附加代表。很多时候,我发现看起来像多重继承的情况最好表达为多播委托的情况。

+0

代表是我一直多次提及。然而,在我的情况下,我需要将一个多态接口引入控制库(具有通用代码)的控件中,然后MyControl的实现将覆盖所需的任何内容。 –

+0

国际货币基金组织代表似乎越来越接近单一继承。而C#并没有解决您希望常见控制处于常见位置的情况。对于大多数对象来说它是有意义的,但对窗口的控件来说没有意义 –

+0

是的,有时候多重继承是最好的。如果您已经考虑并拒绝了委托,那么可能唯一要做的就是实现多个接口。你可能最终会复制粘贴一些接口方法的实现。我不知道有什么方法。 –