2009-09-29 18 views
5

假設下面的代碼(請閱讀我的問題在最終的類代碼註釋):如何通過一個通用類作爲參數的非通用類的構造函數

//This is my Generic Class 
public class ClientRequestInfo<K, V> 
{ 
    public string Id { get; set; } 
    private Dictionary<K, V> parameters; 

    public ClientRequestInfo() 
    { 
     parameters = new Dictionary<K, V>(); 
    } 

    public void Add(K key, V value) 
    { 
     parameters.Add(key, value); 
    } 
} 

public class ProcessParameters() 
{ 
    private void CreateRequestAlpha() 
    { 
     ClientRequestInfo<int, string> info = new ClientRequestInfo<int, string>(); 
     info.Add(1, "Hello"); 
     SynchRequest s = new SynchRequest(info); 
     s.Execute(); 
    } 
    private void CreateRequestBeta() 
    { 
     ClientRequestInfo<int, bool> info = new ClientRequestInfo<int, bool>(); 
     info.Add(1, true); 
     SynchRequest s = new SynchRequest(info); 
     s.Execute(); 
    } 
} 

public class SynchRequest 
{ 
    //What type should I put here? 
    //I could declare the class as SynchRequest<K, V> but I don't want 
    //To make this class generic. 
    private ClientRequestInfo<????,?????> info; 
    private SynchRequest(ClientRequestInfo<?????,?????> requestInfo) 
    { 
     //Is this possible? 
     this.info = requestInfo; 
    } 

    public void Execute() 
    {} 
} 
+0

爲什麼你不希望使用一個通用的SynchRequest? – AnthonyWJones 2009-09-29 17:06:39

+0

你可以談談你將在信息成員的Execute()中做什麼嗎?這可以爲功能相當的答案提供基礎。 – joshperry 2009-09-29 17:12:37

+0

因爲類SynchRequest由其他類項目的打了個SynchRequest的目的是運行服務,不提供任何類型的有關客戶的信息。還有一些類使用SynchRequest,並且不指定或需要任何客戶端信息。所以不是使這個類變得通用的好方法。 (SynchRequest有另一個空的構造函數) – Ioannis 2009-09-29 17:16:15

回答

7

如果你不想讓SynchRequestInfo通用的,可你犯了一個非泛型基類ClientRequestInfo? -

public abstract class ClientRequestInfo 
{ 
    public abstract void NonGenericMethod(); 
} 

public class ClientRequestInfo<K, V> : ClientRequestInfo 
{ 
    public override void NonGenericMethod() 
    { 
     // generic-specific implementation 
    } 
} 

然後:

public class SynchRequest 
{ 
    private ClientRequestInfo info; 

    private SynchRequest(ClientRequestInfo requestInfo) 
    { 
     this.info = requestInfo; 
    } 

    public void Execute() 
    { 
     // ADDED: for example 
     info.NonGenericMethod(); 
    } 
} 
+0

的'Execute'方法需要在基類中聲明,如果'CreateRequestAlpha'和'CreateRequestBeta'都能夠調用它。 – 2009-09-29 17:08:06

+0

'Execute'是'SynchRequest'的一部分,而不是'ClientRequestInfo'。 – 2009-09-29 17:09:09

2

的類必須通用的,如果你想通用的成員變量。

private ClientRequestInfo<????,?????> info; 

是通用會員。

您可以使用非通用基類或接口:

class ClientRequestInfo<K,Y> : IClientRequestInfo 

但在你的榜樣,ClientRequestInfo客戶沒有任何非通用成員,因此接口/基類將是空的,並有無論如何,要被轉換成正確的通用版本纔是有用的。

1

你有兩個選擇,如果你想不會讓SynchRequestInfo通用。

  1. 做一個非泛型基類,它們都使用它。
  2. 提供使用,如ISynchInfo,和你的泛型類實現接口的接口。

在這種情況下,我更喜歡接口方法,因爲您可能希望將來同步其他類型(與客戶端請求分開)。

1

讓ClientRequestInfo客戶(K,V)實現與接口功能SynchRequest將需要一個ClientRequestInfo客戶界面。

相關問題