Methoden in geerberter Klasse aus Basisklasse aufrufen

FwDonnerbalken

Erfahrenes Mitglied
Moin,

zugegeben, der Titel klingt schon recht strange und ich vermute bereits jetzt, dass es keine Lösung für das Problem gibt, aber dennoch:

Ich habe eine "BasisKlasse" und ein paar Klassen die von dieser Klasse erben. Außerdem implementieren die geerbten Klassen ein Interface, welches unter anderem eine Update()-Methode bereitstellt. Innerhalb der Update()-Methode wird jedoch immer der gleiche Code ausgeführt, was natürlich zu einer gewissen und unerwünschten Redundanz führt, wenn dieser Code in jeder geerbten Klasse vorliegt.
Der eigentliche Unterschied liegt in den Methoden (AddTable(), AddColumn(), die innerhalb der Update()-Methode aufgerufen werden, diese erledigen je nach Zweck (unterschiedliche Datenbanksysteme) der geerbten Klassen durchaus etwas unterschiedliche Dinge.

Mein Gedanke war nun, die Updatemethode in die die Basisklasse zu verlagern und diese dann mit base.Update() von der geerbten Klasse aufzurufen. Kein Problem! Aber, Update() soll nun die Methoden AddTable() oder AddColumn() welche mit ihrer jeweils speziellen Implementierung in der geerbten Klasse vorliegt.

Frage 1: Ist das überhaupt möglich?!
Frage 2: Wie?
Frage 3: Was wäre der eleganteste Weg das zu lösen?
 
Mach AddTable und AddColumn virtuell und überschreib sie in den Kindklassen.
Hoffe hab dein Problem richtig verstanden.
 
Und ob... du hast! Ich werde dir zwar jetzt keinen göttlichen Status geben... ABER DANKE!! ;-] :D

Jetzt muss ich nur noch gedanklich die virtual Krücke verstehen, da ich ernsthaft in dem glauben war, dass wenn ich eine Methode in der Basis Klasse aufrufe, dann auch nur die Methode der Basisklasse ausgeführt wird.

Zum besseren Verständis für andere poste ich nochmal meinen schnell zusammengezimmerten Testcode!

C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AbstractTest
{
    class Program
    {
        static void Main(string[] args)
        {
            IExtensions ext = new KinderKlasse();
            ext.Update();

            Console.ReadLine();
        }
    }

    public interface IExtensions
    {
        void Update();
    }

    public class BasisKlasse
    {
        public void Update()
        {
            Console.WriteLine("Update machen...");
            Console.WriteLine("DoSpecial aufrufen...");
            DoSpecial();
        }

        public virtual void DoSpecial()
        {
            Console.WriteLine("Special things aber in der Basisklasse...");
        }
    }

    public class KinderKlasse : BasisKlasse, IExtensions
    {

        #region IExtensions Members

        void Update()
        {
            base.Update();
        }

        public override void DoSpecial()
        {
            Console.WriteLine("Special things...");
        }

        #endregion
    }
}

Folgende Ausgabe:

Code:
Update machen...
DoSpecial aufrufen...
Special things...


Edit: Gerne würde ich dich bewerten, aber scheinbar beantwortest du immer die Fragen von mir, wenn ich dann schonmal selber eine Stelle :( Sorry!
 
Zuletzt bearbeitet:
solange du die Methoden nicht explizit mit base aufrufst sollte eigentlich immer zuerst die überschriebene Methode aufgerufen werden.

Das Problem könnte höchstens sein wenn du explizit auf die Basisklasse castest und dann die Methode aufrufst da weiß ich jetzt nicht wie es sich verhält.
Das müsstest du dann mal testen.

Aber im Prinzip mach ich es auch nicht anders.


Göttlicher Status wär zwar schön aber dafür hab ich wohl auch noch zu viel zu lernen.
(Außerdem besteht dann die Gefahr ungewohlt Vater zu werden, siehe Bibel :D )
 
Ich habe nachdem du mir den Tipp gegeben hast nochmal virtual und abstract in der MSDN nachgeschlagen... mir waren gar nicht alle Auswirkungen von virtual bekannt, habe es eigentlich immer nur in Verbindungen mit dem Überschreiben verwendet.

Anderseits ein wenig Gehirnschmalz mehr und der Verwendung von abstract hätte ich auch selbst auf die Idee kommen können.
 

Neue Beiträge

Zurück