2009-09-29 56 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客户界面。

相关问题