Aufruf einer virtuallen Methode in der Basisklasse erzwingen



  • Hallo Leute,
    hab mal wieder ein kleines Problem beim Coden, hoffe ich kann es halbwegs verständlich ausdrücken.
    Also, ich habe erstens zwei Klassen, eine abstrakte und eine ähem...nicht abstrakte.

    public abstract class Basis
    {
      public virtual TreeNode getNode (TreeNode startNode, object tagToFind)
      {
        foreach (TreeNode node in startNode)
        {
          //Suche...
          //nichts gefunden, dann ChildNodes durchlaufen
          getNode (node, tagToFind);
        }
      }
    }
    
    public class Konkret : Basis
    {
      public override TreeNode getNode(TreeNode startNode, object tagToFind)
      {
        //ein paar Entscheidungen treffen und dann doch die Methode aus der Basisklasse aufrufen
        base.getNode(startNode, tagToFind);
      }
    }
    

    Ist soweit hoffentlich klar. Mein Problem:
    Der rekursive aufruf von getNode(...) in der Klasse Basis ruft mir wieder die Überschriebene Methode der Klasse konkret auf (und genau das soll nicht passieren). Ich muss also irgendwie den getNode(...) Aufruf in der Basisklasse dazu bringen, auch wieder die Methode in der Basisklasse aufzurufen (und nicht die überschriebene). Jemand eine idee (ohne irgendwelche Variablen setzen zu müssen - kann ich in der abgeleiteten Klasse machen, schon klar - gefällt mir aber nicht 🙂 ).
    Danke im Voraus

    Gruß Herb



  • Nachtrag:
    Mir fällt grad auf dass das grottenschlechtes Design ist 🙄 ! Aber nur so aus Interesse: geht sowas?



  • Ich nehme an (ohne es jetzt selbst ausprobiert zu haben), daß

    Basis.getNode(node, tagToFind);
    

    nicht ausreicht, oder?

    Ansonsten müßtest du in Basis eine weitere nicht-virtuelle Funktion erstellen, welche sich dann selbst aufgeruft, so daß die virtuelle Funktion der Basisklasse einfach nur diese nicht-virtuelle Funktion aufruft.

    public abstract class Basis
    {
      public virtual TreeNode getNode (TreeNode startNode, object tagToFind)
      {
         return internal_getNode(startNode, tagToFind);
      }
    
      private TreeNode internal_getNode (TreeNode startNode, object tagToFind)
      {
        foreach (TreeNode node in startNode)
        {
          //Suche...
          //nichts gefunden, dann ChildNodes durchlaufen
          internal_getNode (node, tagToFind); // <- hier dann kein virtueller Aufruf
        }
      }
    }
    


  • Geht nicht, aber wie gesagt, schlechtes Design: Wofür macht man denn Methoden virtuell. Eben dass sichergestellt ist, dass auch wirklich die überschriebenen Methoden aufgerufen werden, ist ja der Sinn der Sache. Auf die Idee mit einer public virtual und einer privaten Methode bin ich auch gekommen, und ist meiner Meinung nach (egal ob der andere Fall jetzt doch irgendwie funtioniert) eine saubere Lösung.
    Mein Problem lag auch sowieso mal wieder ganz wo anders 🙄 , trotzdem danke.


Anmelden zum Antworten