我正在尝试将两个类的选择性功能用于第三类。例如,我有Button1类创建一个花哨的按钮边框和Button2类,它以彩色格式写入文本。现在这些类是由第三方供应商提供给我的,我无法访问代码。这些类没有密封,所以我可以继承,两者都是从基类Button类派生的。
现在我的要求是创建一个名为Button3类的第三个类,它具有制作花哨边框和彩色文本的功能。理想情况下,我会继承两个类并使用特定的功能。这在C#中是不可能的,因为它没有多重继承。
我正在阅读,在这种情况下,接口有助于实现结果。我会请求某人指导我如何在一个类中使用两个类的特定功能。
答案 0 :(得分:1)
正如其他人所说,如果您的应用程序确实需要从给定的两个UI类继承,那么您将无法执行此操作。
比用户界面更普遍,这里有一个想到这个:
完全继承意味着“是一种”关系。带有花哨边框的按钮是按钮,但它们不能是带有花哨文字的按钮。
接口定义了“has-a”关系。在这里,您可以“在按钮上设置精美边框”和“在按钮上设置精美文字的功能”。在这些方面,没有什么可以阻止你将两个“能力”应用于同一个按钮类。
因此,界面允许您进行聚合。考虑两个类DoerOfThis: IThis
和DoerOfThat: IThat
。要创建第三个类同时执行DoThis
和DoThat
的内容,聚合:
public class Something : IThis, IThat
{
public This DoerOfThis { set; }
public That DoerOfThat { set; }
public void DoThis()
{
DoerOfThis.DoThis();
}
public void DoThat()
{
DoerOfThat.DoThat();
}
}
答案 1 :(得分:1)
尝试使用抽象工厂模式。
答案 2 :(得分:0)
即使C#具有多重继承,您也不能只采用不同类的随机部分并将它们组合在一起。问题是你需要的方法只有当它们存在于类中时才能工作,并与该类中的其他方法和私有状态一起工作。如果您尝试将一个类中的方法与另一个类混合和匹配,则它们将无法共享其内部状态。因此,您可能尝试的下一件事是使用包含并拥有内部状态的两个副本,但这会导致尝试保持同步的问题。此外,现在两个班级都希望能够访问绘画方法,等等。他们很可能互相争斗并且互相交换变化,而不是一起工作。很难做到这一点。
您需要做的是获取两个Button类之一的源代码,并使用其他Button类的源代码作为灵感来修改它(您不太可能直接使用代码)。如果您无法访问(或合法使用权利)源代码,那么我担心您不能这样做。
您剩下的选项是:
答案 3 :(得分:0)
接口只定义方法签名,但不定义方法主体。这意味着即使您使用接口,仍然无法在Button1
和Button2
中获取行为。
您可以要求您的供应商执行以下操作:
然后从两个接口继承你的button3
,调用上面的方法来做任何需要做的事情。
答案 4 :(得分:0)
在我看来,当你想要模拟多重继承时,组合与继承一起工作。但是在使用控件时,这通常不是一个选项,因为您通常是另一个控件中的控件。 您可以查看的一些选项是
用户控件 - 如果您使用的是winforms 嵌套控件 - 如果您使用的是WPF。