通用化委托代码 (C#)

本文关键字:代码 通用化 | 更新日期: 2023-09-27 17:56:17

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

通用化委托代码 (C#)

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

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();