L'appel de méthode virtuelle dans la classe de base constructeur

Je sais que l'appel d'une méthode virtuelle à partir d'un constructeur de classe de base peut être dangereux depuis la classe fille peut ne pas être dans un état valide. (au moins en C#)

Ma question est ce que si la méthode virtuelle est celui qui initialise l'état de l'objet ? Est il bon de le faire ou faut-il un processus en deux étapes, d'abord à créer l'objet et ensuite à la charge de l'état ?

Première option: (en utilisant le constructeur pour initialiser l'état)

public class BaseObject {
    public BaseObject(XElement definition) {
        this.LoadState(definition);
    }

    protected abstract LoadState(XElement definition);
}

Deuxième option: (à l'aide d'un processus en deux étapes)

public class BaseObject {
    public void LoadState(XElement definition) {
        this.LoadStateCore(definition);
    }

    protected abstract LoadStateCore(XElement definition);
}

Dans la première méthode, le consommateur, le code permet de créer et d'initialiser l'objet avec une seule instruction:

//The base class will call the virtual method to load the state.
ChildObject o = new ChildObject(definition)

Dans la deuxième méthode, le consommateur devra créer l'objet et à la charge de l'état:

ChildObject o = new ChildObject();
o.LoadState(definition);
  • Pourquoi est-ce dangereux en C#? Vous écrivez que la classe enfant peut ne pas être dans un état valide. Tu veux dire que la classe enfant peut ne pas avoir été initialisé encore?
  • L'enfant de la classe n'EST pas encore initialisé. Classe de Base des constructeurs exécuter avant de enfant de constructeurs de classe. Si l'enfant constructeurs de classe n'est pas anodin, l'état de l'objet sera incohérent.
  • Il n'y a rien de mal avec l'appel de fonction VIRTUELLE dans le constructeur. Plutôt, Ce que vous entendez doit être fonction ABSTRAITE, non? Donc, votre question semble défectueux.
  • Je ne vois pas où est la différence entre virtuel et de méthodes abstraites. Dans les deux cas, elle permet au constructeur de base pour utiliser l'objet enfant dans un état non valide.
  • J'ai écrit au sujet de ce problème ici, avec des captures d'écran et code de.
InformationsquelleAutor Yona | 2009-01-15