50 votes

Convertir la classe dérivée en classe de base

J'essaie de me rafraîchir la mémoire, mais je ne trouve pas de réponses avec Google.

public class BaseClass
{
    public virtual void DoSomething()
    {
        Trace.Write("base class");
    }
}

public class DerivedClass : BaseClass
{
    public override void DoSomething()
    {
        Trace.Write("derived class");
    }
}

Si je crée une instance de classe dérivée, comment la convertir en classe de base de sorte que lorsque DoSomething() est appelé, il utilise uniquement la méthode de la classe de base ?

Une distribution dynamique appelle toujours la méthode substituée de la classe dérivée :

DerivedClass dc = new DerivedClass();

dc.DoSomething();

(dc as BaseClass).DoSomething();

Sortie : "classe dérivée"

58voto

shazia Points 443

Bien que cela semble irrationnel, mais cela fonctionne

 DerivedClass B = new DerivedClass();

BaseClass bc = JsonConvert.DeserializeObject<BaseClass>(JsonConvert.SerializeObject(B));

14voto

Papa Burgundy Points 1683

Vous POUVEZ absolument (appelez la méthode de base), il suffit de lire sur le polymorphisme :

https://docs.microsoft.com/fr-fr/dotnet/csharp/programming-guide/classes-and-structs/polymorphism

Exemple :

public class BaseClass
{
    public void DoWork() { }
    public int WorkField;
    public int WorkProperty
    {
        get { return 0; }
    }
}

public class DerivedClass : BaseClass
{
    public new void DoWork() { }
    public new int WorkField;
    public new int WorkProperty
    {
        get { return 0; }
    }
}

Et comment l'appeler :

DerivedClass B = new DerivedClass();
B.DoWork();  // This calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork();  // This calls the old method.

4voto

oberfreak Points 1467

Essayez d'utiliser new keywor au lieu de override Autant que je sache, cela devrait permettre le comportement souhaité. Je ne suis pas vraiment sûr de cela, alors s'il vous plaît ne me blâmez pas si je me trompe !

public class BaseClass
{
    public virtual void DoSomething()
    {
        Trace.Write("base class");
    }
}

public class DerivedClass : BaseClass
{
    public new void DoSomething()
    {
        Trace.Write("derived class");
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X