2013-06-19 4 views
4

J'ai ceci:appel d'une méthode de classe parente d'une classe dérivée dérivée

public class Base { 
    public virtual void Connect() 
    { 
     // do stuff 
    } 
} 

public class Derived1 : Base { 
    public override void Connect() 
    { 
     base.Connect(); 
     // do other stuff 
    } 
} 

public class Derived2 : Derived { 
    public override void Connect() 
    { 
     base.Connect() // Here I want to call Base::Connect(), not Derived::Connect() 
    } 
} 

Est-il possible que je peux appeler la base :: Connect de Derived2, parce que je veux sauter la partie « faire d'autres choses » de Derived1 :: Connect()?

edit: Il est obligatoire que je dérive de Derived1.

+0

Je ne ai jamais essayé de faire quelque chose comme ça, mais avez-vous essayé 'base.base.Connect()'? – Nolonar

+0

Oui :) Ne fonctionne pas – Kobe

+0

Pouvez-vous changer 'Base' ou' Derived1'? –

Répondre

3

Yo peut essayer diviser connecter en deux fonctions et appeler DoConnect de toutes les classes dérivées, où il est nécessaire:

public class Base { 
    public virtual void Connect() 
    { 
     DoConnect(); 
    } 

    protected void DoConnect() 
    { 
     // do stuff 
    } 
} 

... 

public class Derived2 : Derived1 { 
    public override void Connect() 
    { 
     DoConnect(); 
     ... 
    } 
} 

Si vous ne pouvez pas mettre à jour la classe de base, vous pouvez le faire fendre à Derived1

public class Derived1 : Base { 
    public virtual void Connect() 
    { 
     DoConnect(); 
    } 

    protected void DoConnect() 
    { 
     base.Connect(); 
    } 
} 
+0

Je sais que le code est mauvais, mais parce que je ne peux pas changer beaucoup, votre solution est ce dont j'ai besoin. – Kobe

1

C# dose pas fournir un moyen direct d'appeler base.base.method() vous devez d'abord changer votre conception.
veuillez vérifier cette réponse why-c-sharp-doesnt-support-base-base

Vous avez donc besoin de changer votre conception peu pour faire un petit truc ou une solution de contournement.

  1. Définir une nouvelle méthode dans votre classe Derived1 que c'est seulement le travail est d'appeler base.Connect()
  2. Ensuite, dans votre classe Derived2() définir votre Connect() que « ll suffit d'appeler la fonction précédente définie à l'étape précédente.

vérifier cet exemple:

public class Base { 
    public virtual void Connect() { 
     // do stuff 
    } 
} 

public class Derived1: Base { 
    public override void Connect() { 
     base.Connect(); 
     // do other stuff 
    } 
    public void CallBaseConnnect() { 
     //here make only one call to base.Connect(). 
     //that's how class Derived1 'll provide you away to call base.Connect(). 
     base.Connect(); 
    } 
} 

public class Derived2: Derived { 
    public override void Connect() { 
     //here just make a call to CallBaseConnnect() in base class Derived1 
     //that 'll equivalent to base.base.Connect. 
     base.CallBaseConnnect(); 
    } 
} 
+0

Oui, c'est la bonne façon pour moi. – Kobe

+0

@vBx j'ai mis ma réponse à jour avec un exemple –

Questions connexes