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

时间:2011-11-04 10:35:33

标签: 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 ...

对于容器,我还创建了一个基类并从中继承:

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类型的所有节点,但我想让属性具有特定类型,因此我可以在编译时检测错误的赋值。

提前致谢,
弗兰克

4 个答案:

答案 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;}
}