4

我想将一个属性声明为:

IList<BaseNode and IComplexType> ComplexTypes { get; }

列表中的所有元素都继承自 BaseNode 并实现 IComplexType。有没有办法做到这一点?创建类 BaseNodeComplexType 是行不通的,因为列表中的节点都是 BaseNode 的子类。

更新:我没有想到要充分解释这一点。我有 XmlNode 等子类。XmlNode 继承自 BaseNode。我还有从 XmlNode 继承并实现 IComplexType 的 XmlComplexNode。但是 XmlNode 不继承自 IComplexType(而且我不希望它继承,因为我在某些地方使用“obj is IComplexType”。很抱歉最初没有添加它。

4

5 回答 5

11

不,但你可以用泛型解决它?

class CustomObj<T> where T : BaseNode, IComplexType
{
   IList<T> ComplexTypes { get; }
}

有关使用的通用约束的更多详细信息,请参阅此页面

于 2012-07-17T15:26:03.107 回答
6

正确的行为是派生一个新类,即ComplexBaseNode它同时具有 BaseNode 的继承特性和接口 IComplexType,不是吗?

于 2012-07-17T15:25:10.890 回答
3

没有直接的方法可以做到这一点。

但是您可以使用泛型来实现:泛型类型参数呢?

public class YourClass<T> 
  where T : BaseNode, IComplexType

...您的财产将如下所示:

IList<T> ComplexTypes { get; }
于 2012-07-17T15:26:39.237 回答
0

你住在哪里IList<>。如果您使用通用参数xxx(来自您的标题),您可以说where xxx : BaseNode, IComplexType.

还要考虑是否BaseNode已经可以实现IComplexType,可能是抽象的。

于 2012-07-17T15:25:44.120 回答
-1

的定义 IList<T>意味着您只能为列表中的元素指定一种类型。

创建一个容器类:ComplexNodeContainer<T,U>当 T=BaseNode 和 U=IComplexType 时,它​​将包含实现 IComplexType 的 BaseNode 对象。

当您设置“包含”对象时(最好在构造函数中,或通过方法/属性),您可以检查它是否实现了这两种类型,并采取相应的行动。

您可以有两个属性来检索它,一个作为类型T(或BaseNode),一个作为类型U(或IComplexType在本例中)。

然后您可以将您的属性定义为:IList<ComplexNodeContainer>

于 2012-07-17T15:46:26.590 回答