返回首页


我们都知道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;记表(母公司)的成员将有接收器类。我没有看到,作为自然的,但强迫。
不管怎么说,一个案例是存在的,当然你也可以生活无心肌梗死。

回答

评论会员:c 时间:2