utilizzando C# Ho una classe che contiene tra le altre meta informazioni il nodo radice di un grafico diretto. Chiamiamo questo Classe contenitore. Questo contenitore può apparire in due diverse modalità, modalità Editor e modalità configuratore. A seconda della modalità, il nodo principale è di tipo diverso NodeEdit o NodeConfig, entrambi che ereditano dalla stessa sottoclasse.Modifica del tipo di una proprietà ereditata (in un tipo ereditato)
public abstract class NodeBase
{
string Name { get; set; }
...
}
public class NodeEdit : NodeBase ...
public class NodeConfig : NodeBase ...
Per il contenitore, ho anche creare una classe di base ed ereditare 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 la radice - proprietà specifica (ereditato da NodeBase) tipo come:
public class ContainerEditor : ContainerBase
{
NodeEditor Root { get; set; }
...
}
Ma non può cambiare il tipo di una proprietà definita in ContainerBase. c'è un modo per risolvere questo problema? Posso usare il BaseNode-tipo, e aggiungere un elemento di NodeEditor come
ContainerEditorInstance.Root = new NodeEditor();
perché il tipo NodeEditor viene ereditato dal tipo BaseEditor, ma nella classe Container-Editor, voglio permettere esplicitamente solo il tipo di Proprietà root per essere NodeEditor. Potrei controllare questo nel setter e rifiutare tutti i nodi 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,
Frank
Ciao Marc, grazie per la risposta! L'avevo già provato con la redeclaration, ma probabilmente ho fatto qualcosa di sbagliato. Ho testato il tuo approccio e funziona perfettamente! Generalmente, ci sono situazioni in cui la redeclaring dovrebbe essere preferita a Generics o viceversa o sono uguali? – Aaginor
Tutta questa roba generica sta causando seri problemi quando si deve usare la classe base generica, cioè come un tipo di ritorno astratto.Quindi darò un nuovo colpo al redeclaring, perché sembra essere meno invadente. In confronto a "nuovo" e "override", in che modo la redeclaring funziona internamente? C'è qualche buon articolo che puoi raccomandare? Grazie ancora! – Aaginor