更改继承属性的类型(到继承的类型)

Aag*_*nor 8 c# architecture class-design

使用C#我有一个类,其中包含有向图的根节点.我们称之为Container-Class.此容器可以以两种不同的模式出现,即编辑模式和配置模式.根据模式,根节点属于不同类型的NodeEditNodeConfig,它们都继承自同一个子类.

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)


Mar*_*ell 6

您可以重新声明:

public class ContainerEditor : ContainerBase
{
  public NodeEditor Root {
    get { return (NodeEditor)base.Root; }
    set { base.Root = value; }
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)