繁体   English   中英

推广委托代码(C#)

[英]Generalizing delegate code (C#)

我有两个非常相似的类,基本上做同样的事情。 唯一的区别在于提供给每个类的实例的回调处理程序。 回调处理程序是不同的,它们被不同的参数接受。 我想将这些类中的大部分代码概括为基类。 有关如何智能地概括代理代码的任何想法? 我在.NET 2.0上

注意:我阅读了这篇非常有用的关于继承的博客,其代表和关于协方差和与代表相反的文章,但我仍然没有看到如何在这里应用这些知识。


public class A
{
    public delegate void AHandler(string param1, string param2);
    public void AcceptHandler(string param3, AHandler handler);
    public void InvokeHandler(string forParam1, string forParam2);

    // the rest is same
}

public class B
{
    public delegate void BHandler(int param1);
    public void AcceptHandler(int param2, int param3, int param4, BHandler handler);
    public void InvokeHandler(int forParam1);

    // the rest is same
}

编辑:除了调用具有不同签名的委托方法之外,代码的“其余部分”完全相同。 像这样的东西:


public void StartListening()
{
   Timer timer = new Timer(CheckForChanges, null, 0, 1000);            
}

private void CheckForChanges()
{
    // pull changes, and pass different params to InvokeHandler()
}

为什么不这样设置:
编辑 :我已更新,以包含您编辑的方法。

public abstract class AbstractBase {
    // "the rest"
    public void StartListening() {
        Timer timer = new Timer(CheckForChanges, null, 0, 1000);            
    }
    protected abstract void CheckForChanges();
}

public class A : AbstractBase {
    public delegate void AHandler(string param1, string param2);
    public void AcceptHandler(string param3, AHandler handler);
    public void InvokeHandler(string forParam1, string forParam2);
    protected override void CheckForChanges() {
        //Do stuff for this version of the class
    }
}

public class B : AbstractBase {
    public delegate void BHandler(int param1);
    public void AcceptHandler(int param2, int param3, int param4, BHandler handler);
    public void InvokeHandler(int forParam1);
    protected override void CheckForChanges() {
        //Do stuff for this version of the class
    }
}

这样,您将拥有在单个类中相同的所有代码,然后各个类AB可以使用您需要的任何形式的方法。

或者您是否正在寻找一种方式来调用代理,而不管哪个类?

即。 就像是:

AbstractBase ab = new A();
ab.InvokeDelegate();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM