我们都知道C#不提供多重继承,但提供的参数,程序员可以没有它。在几乎所有情况下,这是事实,尤其是所有的猫,动物或员工和管理人员项目。我看到了少数情况下,如果C#提供了多重继承,解决方案已经自然,优雅和简洁。
试想一下,我有一个组件(用户界面,非UI,无所谓)。您可以调用到的组件,它为您做一些有趣的工作。试想一下,该组件需要一个接口IComponentCallback通知其母公司。所以我会做的是我的父类派生IComponentCallback接口,并通过这个组件。代码看起来像这样:interface IComponentCallback
{
void Callback1();
bool Callback2();
void Callback3(int old, int new);
}
class SomeComponent
{
// The parent on whom callbacks are made
private IComponentCallback _parent = null;
public SomeCompoent(IComponentCallback cmpCallback)
{
// Imagine that callbacks would not be made
// if cmpCallback is null
_parent = cmpCallback;
}
// Other methods in which _parent shall be used
// for making the callbacks.
}
class Parent : IComponentCallback
{
private SomeComponent _someComponent = null;
public Parent()
{
_someComponent = new SomeComponent(this as IComponentCallback);
}
#region IComponentCallback methods implementation
void IComponentCallback.Callback1()
{
// Code making use of this callback
}
bool IComponentCallback.Callback2()
{
// Possible code to provide some
return true;
}
void Callback3(int old, int new)
{
// Code making use of old\new
}
#endregion
}
void Main(string[] args)
{
// .... code ...
// Instantiating a parent which would create
// SomeComponent and establish itself as the
// callback sink.
Parent p = new Parent();
// ... Code ...
}
这是一个典型的案例实例化是回调片。这种情况下是自然和正常的。有可能的情况下一个类实例化并持有的组成部分,而不同的类回调汇行为。那...是不是我们讨论的话题。
现在想象我们的母公司是一个Form类。我相信你有可能遇到的这种情况下,一个形式承载一个UI或非UI组件,你想为你的类中的方法的回调下沉,使你可以直接更新UI。什么如下可能不一定是常见的情况,但我遇到的多几十倍。在我们的应用程序,任何父主机组件。有某些事情的处理回调时做的,因此我们写了一个(基地)类实施IComponentCallback和组件回调片。由于C#不支持心肌梗死,我们自定义的任何形式不能得到回调接收器类,因为他们已经从System.Windows.Form类派生的。
现在是不是明智的争论,可以使用的代表,这个实现是坏的,这是一个角落的情况。实际上,我遇到了这是其中的组成部分,我们正在谈论从第三方几次。在某些情况下,部分是我们自己的回调机制的实施,被称为插件,其意图是相当对面的事件通知。其他大多数可能有quot;无MI在C#quot;记表(母公司)的成员将有接收器类。我没有看到,作为自然的,但强迫。
不管怎么说,一个案例是存在的,当然你也可以生活无心肌梗死。