Vererbung von Klassen...



  • Hallo,

    ich versuche gerade, ein wenig Licht in die tiefe Nacht der Vererbungslehre zu bekommen - bis jetzt mit rel. geringem Erfolg!

    Ich habe ein kleines Beispiel gebastelt, was aber nicht funktioniert:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Test_abgeleiteteKlasse
    {
        class Program
        {
            public enum Geschlecht { male, female, }
            public enum Qualifikation { FH, TH, TU, }
            class Mitarbeiter
            {
                public string Name;
                public string Wohnort;
                public Geschlecht g;
    
                public Mitarbeiter(string Name, string Wohnort, Geschlecht g)
                {
                    this.Name = Name;
                    this.Wohnort = Wohnort;
                    this.g = g;
                }
            }
    
            class LeitenderAngestellter : Mitarbeiter // LeitenderAngestellter ist ein Mitarbeiter
            {
                public Qualifikation q;
    
    XX          public LeitenderAngestellter(string Name, string Wohnort, Geschlecht g, Qualifikation q)
                {
                    this.Name = Name;
                    this.Wohnort = Wohnort;
                    this.g = g;
                    this.q = q;
                }
            }
    
            static void Main(string[] args)
            {
                Mitarbeiter ma = new Mitarbeiter("Weber", "Berlin", Geschlecht.male);
                LeitenderAngestellter la = new LeitenderAngestellter("Röhr", "Prenzlau", Geschlecht.female, Qualifikation.TH);
            }
        }
    }
    

    an Zeile XX kommt der Fehler:

    Fehler 1 Keine Überladung für die Mitarbeiter-Methode nimmt 0 Argumente an. D:\downloads\MS_Visual_C#_Einstieg\Buchdateien\Test_abgeleiteteKlasse\Program.cs 30 20 Test_abgeleiteteKlasse

    Wer kann mir mal mit verständlichen Worten erklären, was:
    "Keine Überladung für die Mitarbeiter-Methode nimmt 0 Argumente an."
    bedeutet?
    Die Mitarbeiter-methode benötigt 3 Argumente, ok.
    Warum 0 Argumente? Ich übergebe doch alle erforderlichen 4 Argumente!
    3 für die Basisklasse und für den Leitenden Angestellten noch die Qualifikation!

    EDIT:

    Frage 2:
    muß man bei enum-Typ-Parameter das so machen:

    Mitarbeiter ma = new Mitarbeiter("Weber", "Berlin", Geschlecht.male);
    

    So geht es ja nicht:

    Mitarbeiter ma = new Mitarbeiter("Weber", "Berlin", male);
    

    Übrigens habe ich jetzt einen zweiten Konstruktor für die Mitarbeiter-Klasse codiert:

    public Mitarbeiter()
                {
                }
    

    Jetzt geht der Code! Beim Erzeugen der Instanz für LeitenderAngestellter mittels new-Operator geht es erst zum Konstruktor der abgeleiteten Klasse (dort scheinen alle übergebenen Parameter "verbraucht" zu werden) dann aber gleich hoch zum Konstruktor der Basisklasse. Und da hatte er keinen passenden Konstruktor mit 0 Argumenten gefunden, da die ja schon beim LeitenderAngestellter-Konstruktor "verbraucht" wurden. Deshalb wohl der Fehler.

    Jedenfalls erkläre ich mir das jetzt mal so, wenn mir von Euch das nicht noch exakter erklärt wird.



  • Du musst den Basisklassenkonstruktor aufrufen.

    public LeitenderAngestellter(string Name, string Wohnort, Geschlecht g, Qualifikation q) : base(Name, Wohnort, g)
    


  • Hallo Noddles,

    Danke für Deine Antwort!
    Ja, so geht es!

    Bitte guck mal, wie ich das jetzt gemacht habe! (siehe EDIT von meinem vorigen Posting)!

    Ist das so auch gut, oder hat das so Nachteile?

    Gruß,

    Micha



  • kurze erklärung:
    bei erzeugung der abgeleiteten klasse wird zuerst der standardkonstruktor der vaterklasse aufgerufen und danach der konstruktor der kindklasse. sollte es keinen standardkonstruktor(einen konstruktor ohne argumente) geben, so bricht der compilevorgang ab, weil er eben keinen passenden konstruktor findet.
    in dem fall musst du dem kompiler selbst einen konstruktor der oberklasse vorgeben, der aufgerufen werden muss. und das eben mit dem ':' - Operator. (siehe Noodles)
    Warum der code nach dem hinzufügen von "Mitarbeiter()" funktioniert, sollte dir nun einleuchten 🙂

    p.s.: sorry für die fehlende gross-kleinschreibung...


Anmelden zum Antworten