c# - 泛化委托(delegate)代码 (C#)

标签 c# delegates .net-2.0 c#-2.0

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

注意:我读了this关于委托(delegate)继承的非常有用的博客和关于委托(delegate)协变和逆变的文章,但我仍然不明白如何在此处应用这些知识。


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
}

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


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 可以具有任何形式的您需要的方法。

或者您正在寻找一种方法来调用委托(delegate),而不管是哪个类?

即。像这样的东西:

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

关于c# - 泛化委托(delegate)代码 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5995786/

相关文章:

objective-c - UITableView 委托(delegate)方法被调用了两次

.net - ConstructorInfo.Invoke 与委托(delegate)

ios - 导航栏按钮的 SWift 3.0 委托(delegate)

c# - .NET 源代码可以硬编码调试断点吗?

.net - ASP.NET WebForm 的 'page lifecycle' 是什么?

c# - 如何强制 Visual Studio 在 https 中运行网站

c# - LINQ 中的多级分组?

c# - 允许类属性在 WebAPI 2 post 方法中为 null

c# - 使用 oledb netting "_xlnm#_FilterDatabase"作为工作表名称的多工作表导入

c# - 重复的堆栈跟踪意味着什么?