web-dev-qa-db-fra.com

Remplacer une méthode remplacée (C #)

J'essaie de remplacer une méthode remplacée (si cela a du sens!) En C #. 

J'ai un scénario similaire à celui ci-dessous, mais lorsque j'ai un point d'arrêt dans SampleMethod () dans la classe "C", il n'est pas touché, alors que le même point d'arrêt est utilisé dans la méthode "B". 

public class A
{
      protected virtual void SampleMethod() {}
}

public class B : A 
{
      protected override void SampleMethod()
      {
           base.SampleMethod(); 
      }
}

public class C : B
{
      protected override void SampleMethod() 
      {
           base.SampleMethod(); 
      }
}

Merci d'avance! 


Modifier:  

Ok, le contexte aiderait:

Ceci est dans le contexte d'un contrôle composite afin que la classe A hérite de CompositeControl et appelle SampleMethod () après avoir redéfini la méthode CreateChildControls (). 

35
Robert W

Sans voir le code qui appelle SampleMethod, je suppose que vous avez un objet de type B et appelez SampleMethod à cet effet.

16
Colin Mackay

Le dépassement peut être effectué dans une chaîne aussi longtemps que vous le souhaitez. Le code que vous avez montré est correct.

La seule explication possible du comportement observé est que l'objet auquel vous faites référence est en réalité de type B. Je suggère que vous vérifiiez ceci, et si les choses ne voulaient toujours pas avoir un sens, publiez l'autre code approprié.

35
Noldorin

Le point d'arrêt n'est probablement pas touché car vous avez en fait instancié une instance de la classe "B".

La résolution de substitution de méthode fonctionne en fonction du type runtime de la classe dont la méthode doit être appelée. Donc, si vous aviez le code suivant:

C c = new C();
c.SampleMethod();

et les suivants:

C c = new C();
B b = (B)c;
b.SampleMethod();

les deux types runtime de la classe dont SampleMethod sera appelée sont de type B.

3
Mike J

Cette solution fonctionne bien; bien que pour l'utiliser réellement en dehors de la classe dans laquelle la méthode est, vous devez définir l'accès de SampleMethod à public plutôt que protected dans tous les cas où il apparaît, ainsi:

public class A
{
    public virtual void SampleMethod() 
    {
        Console.WriteLine("lol");
    }
}

public class B : A
{
    public override void SampleMethod()
    {
        base.SampleMethod();
    }
}

public class C : B
{
    public override void SampleMethod()
    {
        base.SampleMethod();
    }
}
2
Callum Rogers

pour remplacer plus d'une fois dans la hiérarchie utiliser quelque chose comme ça

// abstract class
abstract class A
    {
        public abstract void MethodOne();
    }

// class B inherits A
class B : A
{
    public override void MethodOne()
    {
        Console.WriteLine("From Class B");
    }
}

// class C inherits B
class C : B
{
    public override void MethodOne()
    {
        Console.WriteLine("From Class C");
    }
}

// class D inherits C
class D : C
{
    public override void MethodOne()
    {
        Console.WriteLine("From Class D");
    }
}

// etc......

// class Main method Class

class MainClass
{
    public static void Main()
    {
        B[] TestArray = new B[3];
        B b1 = new B();
        C c1 = new C();
        D d1 = new D();

        TestArray[0] = b1;
        TestArray[1] = c1;
        TestArray[2] = d1;

        for (int i = 0; i < TestArray.Length; i++)
        {
            TestArray[i].MethodOne();
        }

        Console.ReadLine();
    }
}

Je l'ai fait dans ce code dans ce lien http://www.4shared.com/rar/0SG0Rklxce/OverridingMoeThanOnce.html

0
altamimi.morad