使用C#我有一个类,其中包含有向图的根节点以及其他元信息。我们称之为 Container-Class 。此容器可以以两种不同的模式出现,即编辑模式和配置模式。根据模式,根节点属于不同类型 NodeEdit 或 NodeConfig ,两者都继承自同一个子类。
public abstract class NodeBase
{
string Name { get; set; }
...
}
public class NodeEdit : NodeBase ...
public class NodeConfig : NodeBase ...
对于容器,我还创建了一个基类并从中继承:
public abstract class ContainerBase
{
NodeBase Root { get; set; }
...
}
通过继承ContainerBase为Editor-和Configuratorcontainer创建类时,我希望成为Root的类型 - 特定的属性(从NodeBase继承)类型:
public class ContainerEditor : ContainerBase
{
NodeEditor Root { get; set; }
...
}
但是我无法更改ContainerBase中定义的属性的类型。有没有办法解决这个问题?我可以使用BaseNode类型,并添加NodeEditor的元素,如
ContainerEditorInstance.Root = new NodeEditor();
因为NodeEditor类型继承自BaseEditor类型,但在Container-Editor类中,我想明确只允许Root属性的类型为 NodeEditor 。 我可以在setter中检查这个并拒绝除NodeEditor类型的所有节点,但我想让属性具有特定类型,因此我可以在编译时检测错误的赋值。
提前致谢,
弗兰克
答案 0 :(得分:12)
使用泛型:
public abstract class ContainerBase<T> where T:NodeBase
{
T Root { get; set; }
...
}
public class ContainerEditor : ContainerBase<NodeEditor>
{
...
}
答案 1 :(得分:4)
您可以重新声明:
public class ContainerEditor : ContainerBase
{
public NodeEditor Root {
get { return (NodeEditor)base.Root; }
set { base.Root = value; }
}
...
}
答案 2 :(得分:1)
您可以使容器库通用:
public abstract class ContainerBase<TRoot> where TRoot : NodeBase
{
TRoot Root { get; set; }
...
}
在派生类中,指定类型:
public class ContainerEditor : ContainerBase<NodeEditor>
{
...
}
答案 3 :(得分:0)
我想这里有一个很好的解决方案是Generics。所以你要写这样的东西:
public class ContainerEditor<T>:ContainerBase
{
T Root {get;set;}
}