Vererbung: Funktion auf gleicher Ebene aufrufen



  • Es gibt 3 Klassen die in einer Kette voneiander erben. Die Funktionen sind virtual und sollen die Funktionalität nur erweitern, das heißt am Ende der Funktion wird mit "base" die gleiche Funktion eine Vererbungsebene darüber aufgerufen.

    Wie rufe ich in der mittleren Klasse Funktionen auf die sich auf der gleichen Vererbungsebene befinden? Mit this.MyFunc() wird die unterste Funktion in der Vererbungshierarchie aufgerufen.



  • Ich glaube die Erklärung war zu kompliziert. Wie kann ich die Funktion aufrufen die in der gleichen Klasse ist? (Und nicht die override Funktion die in einer abgeleiteten Klasse steht.)



  • namespace ConsoleApplication1 {
    
        public class Static {
            public static string I;
        }
    
        internal class A {
            internal virtual void Abc() {
                Static.I += "class_A ";
            }
        }
    
        internal class B : A {
            internal override void Abc() {
                Static.I += "class_B ";
                base.Abc();
            }
    
            internal void DoTheRightThing() {
                this.Abc(); // Hier möchte ich die Funktion in dieser Klasse aufrufen.
                // In dem statischen Feld soll kein class C auftauchen.
            }
        }
    
        internal class C : B {
            internal override void Abc() {
                Static.I += "class_C ";
                base.Abc();
            }
        }
    
        class Program {
            static void Main(string[] args) {
                B MyC = new C();
    
                MyC.DoTheRightThing();
            }
        }
    }
    


  • Wenn ich dich richtig verstehe, dann muss der base.Abc() Aufruf aus der abgeleiteten Methode raus. - Ansonsten wird diese natürlich ausgeführt.



  • Entferne virtual/override von Abc.



  • inflames2k schrieb:

    Wenn ich dich richtig verstehe, dann muss der base.Abc() Aufruf aus der abgeleiteten Methode raus. - Ansonsten wird diese natürlich ausgeführt.

    An anderer Stelle benötige ich aber die gesamte Kette: Wenn Abc() sollen alle drei Ebenen durchlaufen werden.

    MFK schrieb:

    Entferne virtual/override von Abc.

    Stimmt, so geht es. Vielen Dank 🙂

    namespace ConsoleApplication1 {
    
        public class Static {
            public static string I;
        }
    
        internal class A {
            internal void Abc() {
                Static.I += "class_A ";
            }
        }
    
        internal class B : A {
            internal new void Abc() {
                Static.I += "class_B ";
                base.Abc();
            }
    
            internal void DoTheRightThing() {
                this.Abc(); // Hier möchte ich die Funktion in dieser Klasse aufrufen.
                // In dem statischen Feld soll kein class C auftauchen.
            }
        }
    
        internal class C : B {
            internal new void Abc() {
                Static.I += "class_C ";
                base.Abc();
            }
        }
    
        class Program {
            static void Main(string[] args) {
                B MyC = new C();
    
                MyC.DoTheRightThing();
            }
        }
    }
    

Anmelden zum Antworten