Clone de la classe dérivée de la classe de base de la méthode

J'ai une classe de base abstraite Base qui a certaines propriétés communes, et de nombreux dérivés de ceux qui mettent en œuvre des logiques différentes, mais rarement, des champs supplémentaires.

public abstract Base
{
    protected int field1;
    protected int field2;
    ....

    protected Base() { ... }
}

Parfois j'ai besoin de clone de la classe dérivée. Donc, je pense, suffit de faire un virtuel Clone méthode dans ma classe de base et remplacez uniquement dans les classes dérivées qui ont des champs supplémentaires, mais bien sûr, ma Base classe ne serait pas plus abstrait (ce qui n'est pas un problème puisqu'il ne dispose que d'un protected constructeur).

public Base
{
    protected int field1;
    protected int field2;
    ....

    protected Base() { ... }

    public virtual Base Clone() { return new Base(); }
}

public A : Base { }
public B : Base { }
  1. La chose est, depuis je ne peux pas savoir le type de la classe dérivée dans ma la Base de l'un, ne serait-ce pas conduire à avoir un Base instance de classe, même si je l'appelle sur les dérivées de celles ? (a.Clone();) (en fait, après un test c'est ce qui se passe, mais peut-être que mon test n'a pas été bien conçu c'est pourquoi j'ai un doute à ce sujet)

  2. Est-il un bon moyen (pattern) de mettre en œuvre une base de Clone méthode de travail que je pense ou ce que je dois écrire le même code dans chaque classe dérivée (j'aimerais vraiment éviter ça...)

Merci pour votre aide

  • Pourquoi ne pas simplement faire la Clone méthode abstraite, de sorte qu'il doit être mis en œuvre par les classes dérivées?
  • c'est ce que j'ai fait à l'origine, mais il m'entrainer à l'écriture de code en double. Presque tout ce qui pourrait être fait dans la base de méthode clone, c'est pourquoi
  • Pourquoi ne pas utiliser this.MemberwiseClone() ?
  • parce que je fais quelques modifications dans les champs pendant le processus de clonage, ce n'est pas exactement un clone, mais à proximité de est. Mais cela pourrait être une option de toute façon depuis que j'ai appeler cette méthode de clonage seulement dans 1 endroit, il aurait juste été mieux de mettre en œuvre cette logique dans la classe de base
  • Qui fait sens, vérifier mon ansewer, et Alexander Simonov a également la bonne réponse ainsi
  • En effet, les deux sont de bonnes réponses, merci pour votre aide!

InformationsquelleAutor ppetrov | 2013-10-01