Aag*_*nor 8 c# architecture class-design
使用C#我有一个类,其中包含有向图的根节点.我们称之为Container-Class.此容器可以以两种不同的模式出现,即编辑模式和配置模式.根据模式,根节点属于不同类型的NodeEdit或NodeConfig,它们都继承自同一个子类.
public abstract class NodeBase
{
string Name { get; set; }
...
}
public class NodeEdit : NodeBase ...
public class NodeConfig : NodeBase ...
Run Code Online (Sandbox Code Playgroud)
对于容器,我还创建了一个基类并从中继承:
public abstract class ContainerBase
{
NodeBase Root { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
通过继承ContainerBase为Editor-和Configuratorcontainer创建类时,我希望成为Root的类型 - 特定的(继承自NodeBase)类型,如:
public class ContainerEditor : ContainerBase
{
NodeEditor Root { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
但我无法更改ContainerBase中定义的属性的类型.有没有办法解决这个问题?我可以使用BaseNode类型,并添加一个NodeEditor元素
ContainerEditorInstance.Root = new NodeEditor();
Run Code Online (Sandbox Code Playgroud)
因为NodeEditor类型继承自BaseEditor类型,但在Container-Editor类中,我想明确地只允许Root属性的类型为NodeEditor.我可以在setter中检查这个并拒绝NodeEditor类型的所有节点,但是我想让属性具有特定类型,所以我可以在编译时检测错误的赋值.
先谢谢你,
弗兰克
Bla*_*lau 12
使用泛型:
public abstract class ContainerBase<T> where T:NodeBase
{
T Root { get; set; }
...
}
public class ContainerEditor : ContainerBase<NodeEditor>
{
...
}
Run Code Online (Sandbox Code Playgroud)
您可以重新声明:
public class ContainerEditor : ContainerBase
{
public NodeEditor Root {
get { return (NodeEditor)base.Root; }
set { base.Root = value; }
}
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6119 次 |
| 最近记录: |