3

考虑以下代码:

abstract class SomeClassX<T>
{
  // blah
}

class SomeClassY: SomeClassX<int>
{
  // blah
}

class SomeClassZ: SomeClassX<long>
{
  // blah
}

我想要 SomeClassX<T> 的集合,但是,这是不可能的,因为 SomeClassX<int> != SomeClassX<long> 和 List<SomeClassX<>> 是不允许的。

所以我的解决方案是让 SomeClassX<T> 实现一个接口并将我的集合定义为,其中 ISomeClassX 是接口:

class CollectionOfSomeClassX: List<ISomeClassX>
{
  // blah
}

这是最好的方法,还是有更好的方法?

4

2 回答 2

1

我要么使用你建议的接口,要么让 SomeClassX 从另一个类继承。这实际上取决于您需要对集合中的对象做什么。无论它们有什么共同的功能都应该放在基类中,或者如果看起来更合适的话,应该放在接口中。

于 2008-10-22T20:43:32.803 回答
1

您最好的选择是按照您的建议,创建一个接口ISomeClass并实现它。我最近用一个用户偏好和配置文件系统解决了同样的问题,我们想用它来存储各种数据类型。它归结为:

public interface IEntry
{
    // ...
    object Value { get; set; }
}

由于隐式实现了接口Entry<Single>,因此可以实例化特定的:Entry<T>

public class Entry<T> : IEntry
{
    T Value { get; set; }
    object IEntry.Value { get { return Value; } set { return Value; } }
}

但是到了IDictionary<string,IEntry>时候,我们又将IEntry实例转换为Entry<T>适当的类型或将 Value 属性IEntry转换为适当的类型。

// assume entries is IDictionary<string,IEntry>...
var entry = entries["pizza-weight"];
var weight = (float)entry.Value;

当然,这一切都是有道理的,因为就像SomeClass<int>!=SomeClass<long>所以是真的IList<SomeClass<int>>!= IList<SomeClass<long>>

于 2008-10-22T21:16:38.680 回答