3

次のクラスがあるとします。

public class BaseConfig
{
}

public class SpecialConfig : BaseConfig
{
}

次に、これらを含むジェネリック クラス定義があります。

public class ConfigList<T> : ObservableCollection<T> where T : BaseConfig
{
}

次に、ConfigList オブジェクトのコレクションが必要な別のクラスがあります。

public class ConfigurationManager
{
    private ObservableCollection<ConfigList<BaseConfig>> _configItems

    public ConfigurationManager()
    {
        _configItems = new ObservableCollection<ConfigList<BaseConfig>>();
    }

    public void AddConfigList(ConfigList<BaseConfig> configList)
    {
        _configItems.Add(configList);
    }
}

次に、アプリケーションコードの他の場所にこれがあります:

ConfigurationManager _manager = new ConfigurationManager();
ConfigList<SpecialConfig> _configuration = new ConfigList<SpecialConfig>();

奇妙な理由で、C# では継承により次のことが許可されると思っていましたが、そうではありません。私が知りたいのは、以下で行っているように、ジェネリック型のクラスのコレクションにオブジェクトを追加する方法です (これは確かに人々が遭遇する一般的な問題であり、これを達成するための簡単なパターン/ソリューションがあります):

_manager.AddConfigList(_configuration);
4

2 に答える 2

5

この方法では機能しませんが、幸いなことに、 generic の共分散を利用して回避し、1 つの新しい共分散インターフェイスを定義できます。

public interface IConfigList<out T>
{
}

したがって、ConfigList は次のインターフェイスを継承します。

public class ConfigList<T> : ObservableCollection<T>, IConfigList<T> 
                                  where T : BaseConfig
{
}

そして、代わりにあなたのConfigurationManager用途IConfigListConfigList

public class ConfigurationManager
{
    private ObservableCollection<IConfigList<BaseConfig>> _configItems;

    public ConfigurationManager()
    {
        _configItems = new ObservableCollection<IConfigList<BaseConfig>>();
    }

    public void AddConfigList(IConfigList<BaseConfig> configList)
    {
        _configItems.Add(configList);
    }
}

その後、動作します:

 ConfigurationManager _manager = new ConfigurationManager();
 IConfigList<BaseConfig> _configuration = new ConfigList<SpecialConfig>();

 _manager.AddConfigList(_configuration);
于 2012-09-22T16:19:20.070 に答える
0

これを実現するには、ジェネリックの共分散を利用する必要があります。

于 2012-09-22T16:18:12.433 に答える