2011-05-13 91 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