2011-05-13 50 views
4

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

注:我读与代表和协方差和逆变与代表文章继承this非常有用的博客,但我仍然不明白如何,知识可以应用在这里。


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() 
} 
+2

在.NET 4.0之前,协变和反方差是非常有限的。这就是当泛型类型的协变和反变化的主要支持来到生活时 – 2011-05-13 17:50:32

+3

您可以添加一些关于委托和处理程序如何由最常见的代码调用的细节吗?我正在考虑某种由基础定义和调用的抽象OnRaise()事件,但在A和B中被重写和推送,以便与委托和处理程序做'正确的事情',但我不知道如果不知道更多 – n8wrl 2011-05-13 17:57:04

回答

5

为什么不设置它是这样的:
编辑:我已经更新,包括你的编辑方法。

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

是的,这将很好地推广委托代码,因为除了使用与委托相关的东西(参见编辑)之外,代码的其余部分是相同的。 – kateroh 2011-05-13 18:41:13

+0

@kateroh - 所以'StartListening'是一样的,但是'CheckForChanges'依赖于委托方法签名/调用? – 2011-05-13 19:06:13

+0

是的。这两个类中的其他方法都是一样的。 – kateroh 2011-05-13 19:09:46