Modifica del tipo di una proprietà ereditata (in un tipo ereditato)

usando C # ho una class che contiene tra le altre meta informazioni il nodo radice di un grafico diretto. Chiamiamo questo la class contenitore . Questo contenitore può apparire in due diverse modalità, modalità Editor e modalità configuratore. A seconda della modalità, il nodo radice è di un tipo diverso NodeEdit o NodeConfig , entrambi che ereditano dalla stessa sottoclass.

public abstract class NodeBase { string Name { get; set; } ... } public class NodeEdit : NodeBase ... public class NodeConfig : NodeBase ... 

Per il contenitore, creo anche una class base ed eredita da essa:

 public abstract class ContainerBase { NodeBase Root { get; set; } ... } 

Quando si creano le classi per Editor- e Configuratorcontainer ereditando da ContainerBase, voglio diventare il tipo di proprietà Root il tipo specifico (ereditato da NodeBase) come:

 public class ContainerEditor : ContainerBase { NodeEditor Root { get; set; } ... } 

Ma non posso cambiare il tipo di una proprietà definita in ContainerBase. c’è un modo per risolvere questo problema? Posso usare il tipo BaseNode e aggiungere un elemento di NodeEditor come

 ContainerEditorInstance.Root = new NodeEditor(); 

poiché il tipo NodeEditor è ereditato dal tipo BaseEditor, ma nella class Container-Editor, desidero esplicitamente consentire solo al tipo di proprietà Root di essere NodeEditor . Potrei controllare questo nel setter e rifiutare tutti i nodes ma quelli di tipo NodeEditor, ma mi piacerebbe che la proprietà fosse del tipo specifico, così posso rilevare assegnazioni errate in fase di compilazione.

    Grazie in anticipo,
    Franco

    Puoi ridichiarlo:

     public class ContainerEditor : ContainerBase { public NodeEditor Root { get { return (NodeEditor)base.Root; } set { base.Root = value; } } ... } 

    Usa i generici:

     public abstract class ContainerBase where T:NodeBase { T Root { get; set; } ... } public class ContainerEditor : ContainerBase { ... } 

    Puoi rendere generico il contenitore base:

     public abstract class ContainerBase where TRoot : NodeBase { TRoot Root { get; set; } ... } 

    Nella class derivata specifichi il tipo:

     public class ContainerEditor : ContainerBase { ... } 

    Suppongo che una buona soluzione qui sarà Generics. Quindi dovresti scrivere qualcosa del genere:

     public class ContainerEditor:ContainerBase { T Root {get;set;} }