Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对派生类型执行公共操作_C# - Fatal编程技术网

C# 对派生类型执行公共操作

C# 对派生类型执行公共操作,c#,C#,有没有一种简洁的方法可以让几个类(比如派生自1个接口)各自执行相同的操作?想想ASP.NET中为每个请求(每个请求都是关键字)提供服务的http模块——有没有办法对派生类型执行一些常见操作?反射可能是一种方式,尽管我对基类级别的方式感兴趣 谢谢如果您的类都派生自一个公共基类,那么您可以将此逻辑放在公共基类中。不仅仅是一个接口;你想在中间有一个抽象类: abstract class Whatever : IFooable { public virtual void Do () {

有没有一种简洁的方法可以让几个类(比如派生自1个接口)各自执行相同的操作?想想ASP.NET中为每个请求(每个请求都是关键字)提供服务的http模块——有没有办法对派生类型执行一些常见操作?反射可能是一种方式,尽管我对基类级别的方式感兴趣


谢谢

如果您的类都派生自一个公共基类,那么您可以将此逻辑放在公共基类中。

不仅仅是一个接口;你想在中间有一个抽象类:

abstract class Whatever : IFooable {
    public virtual void Do () {
        PreDo();
    }

    protected abstract void PreDo();
}
然后调用
Do
,所有实现类型都会首先自动调用
PreDo


(编辑:为了明确起见,我将
Do
设置为虚拟,因此这意味着如果重新实现它,您应该首先调用
base.Do()
,以确保它实际调用父方法)。

如果我正确理解您的要求,那么也许可以使用事件处理程序

如果您需要一组对象来响应某个操作,那么事件(也称为“消息传递”)就是一种方法

像这样的

class Foo
{
     public event EventHandler PerformAction;

     private void OnActionNeeded()
     {
          // A bunch of Bars need to do something important now.

          if (PerformAction != null)
                 PerformAction.Invoke();
     }

}

class Bar
{
   public Bar(Foo fooToWatch)
   {
         fooToWatch.PerformAction += new EventHandler(Foo_PerformAction);
   }

   void Foo_PerformAction(object sender, EventArgs e)
   {
        // Do that voodoo that you do here.
   }
}

也许这不是一个完整的答案,但我很想从AOP和属性的角度来思考

一些参考资料:


模板方法设计模式可能适用于您的要求


设计接口的总体要点是在两个组件之间提供协议,并隐藏实现部分。 这些接口用作通信媒介。 您所要求的似乎是特定于实现的。 可以使用实用程序类(使用该方法的单例)干净地处理
我不建议在当前场景中使用抽象类。

我认为接口(或抽象类)的全部要点是每个实现类都支持相同的通用方法。Aaronaught:很明显你没有,但是有一种情况是,在某些初始化过程中,自动为你调用一个方法是很好的。虽然我同意这有点奇怪。