6

次のコードを想定します (最終クラスのコード コメントで私の質問を読んでください)。

//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()
    {}
}
4

4 に答える 4

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();
    }
}
于 2009-09-29T17:05:19.470 に答える
2

ジェネリック メンバー変数が必要な場合は、クラスがジェネリックである必要があります。

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

ジェネリック会員です。

非ジェネリックの基本クラスまたはインターフェイスを使用できます。

class ClientRequestInfo<K,Y> : IClientRequestInfo

しかし、あなたの例では、ClientRequestInfo には非ジェネリック メンバーがないため、インターフェイス/基本クラスは空になり、とにかく有用であるために正しいジェネリック バージョンにキャストする必要があります。

于 2009-09-29T17:04:23.277 に答える
1

ClientRequestInfo(K,V) に、SynchRequest が必要とするインターフェイス関数を使用して ClientRequestInfo インターフェイスを実装させます。

于 2009-09-29T17:08:49.773 に答える
1

SynchRequestInfo をジェネリックにしたくない場合は、2 つのオプションがあります。

  1. 非ジェネリック基本クラスを作成し、両方で使用します。
  2. ISynchInfo などの使用するインターフェイスを提供し、ジェネリック クラスにインターフェイスを実装させます。

この場合、将来、(クライアント要求とは別の) 他のタイプを同期する必要があるかもしれないので、インターフェイス アプローチをお勧めします。

于 2009-09-29T17:08:46.357 に答える