Kapitel 3: Subklasse

  • Kapitel 3: Subklasse

    Hallo zusammen,

    ich bin im Buch auf Seite 204/205 und habe eine Frage.
    Ich hab' eine Seite weiter vorn aufgehört zu lesen und erst einmal versucht die Subklasse Guitar selbst zu implementieren. Das ist mir auch gelungen.

    Als ich dann weitergelesen habe, war ich etwas überrascht, dass man offensichtlich eine eigene Methode für die Objekterzeugung benötigt, obwohl die doch (fast) identisch ist mit der entsprechenden Methode der Superklasse Instrument und von dieser geerbt werden kann.

    Es hat ja auch ohne diese Objekterzeugungs-Methode funktioniert (allerdings kommt beim build eine Warnung). Es wurde mit folgendem Code auch ein Objekt der Klasse "Guitar" erstellt und nicht etwa eins, der Klasse "Instrument".

    Quellcode

    1. aGuitar = [Guitar instrumentWithName:@"Eine Gitarre"];
    Verwendet wurde dabei offensichtlich +instrumentWithName: der Klasse Instrument.

    Meine Fragen lauten:
    1. Warum benötigt man für die Subklasse eine eigene Methode zur Objekterzeugung, selbst wenn diese im Wesentlichen identisch ist, mit der der Basisklasse.

    2. Was genau bedeutet die Warnung "assignment from distinct Object-C type"? (Diese erscheint, wenn man in der Klasse Guitar o.g. Methode nicht implementiert.)



    Danke im Voraus und Gruß
    D.Mon

    Edit:
    Habe gerade bemerkt, dass noch nicht einmal die Warnung kommt, wenn ich anstelle von
    Guitar *aGuitar;
    schreibe
    Instrument *aGuitar;
    Habe Mut, Dich Deines eigenen Verstandes zu bedienen.
    (Immanuel Kant)
  • RE: Kapitel 3: Subklasse

    Original von D.Mon
    Meine Fragen lauten:
    1. Warum benötigt man für die Subklasse eine eigene Methode zur Objekterzeugung, selbst wenn diese im Wesentlichen identisch ist, mit der der Basisklasse.

    2. Was genau bedeutet die Warnung "assignment from distinct Object-C type"? (Diese erscheint, wenn man in der Klasse Guitar o.g. Methode nicht implementiert.)



    Danke im Voraus und Gruß
    D.Mon

    Edit:
    Habe gerade bemerkt, dass noch nicht einmal die Warnung kommt, wenn ich anstelle von
    Guitar *aGuitar;
    schreibe
    Instrument *aGuitar;


    1. Um die Klasse Guitar zu instanzieren. In der Regel tust Du in der init-Methode von Guitar ja Klassenspezifische Dinge erstellen, welche die Klasse Instrument nicht hat (z.B. Anzahl Saiten, usw...).
    2. Naja der Compiler erwartet Guitar und nicht Instrument, wobei es ja nur ne Warnung ist. Im Prinzip ist es nicht falsch (aber in der Regel will man das ja nicht).
  • RE: Kapitel 3: Subklasse

    Frage 2:
    Es bedeutet, dass du einen Typ an eine Variable eines anderen Typs zugewiesen hat und sich das nicht durch den Compiler auf die Schnelle heilen lässt. (Etwa Zuweisung von Float an Integer geht, weil der Compiler das repariert.)

    +instrumentWithName: erzeugt eine Instanz von Instrument und hat einen entsprechenden Returnwert.

    aGuitar ist ein Zeiger auf eine Subklasse, nämlich Guitar. Du weist also den Returnwert als Basisklasse an die Variable als Subklasse zu. Dies ist verboten, S. 149 f.

    Zu Frage 1:
    Notwendig ist das nicht. Aber in allen Fällen in Band 1 bedeutet es zusätzliche Sicherheit.

    Üblicherweise lautet aber der CA einer Klasse etwa +klassennameWithName: Dies bedeutet, dass er bereits typisiert ist. +instrumentWithName: würde dem Namen nach eine Instrument-Instanz erzeugen, nicht eine Guitar-Instanz.

    Weil aber schon über den Namen eine Typisierung erfolgt, typisiere ich auch den Rückgabewert entsprechend: +(Guitar*)guitarWithName:… bzw. +(Instrument*)instrumentWithName:… Das führt dazu, dass bei einem Aufruf von +instrumentWithName der falsche Returnwert (Instrument als Basisklasse anstelle von Guitar als Subklasse) vorhanden ist, was eine Warnung wirft und eine Warnung werfen soll. Dieses Problem tritt auch bei Initialisierern auf, weshalb die id-typisiert sind. Dazu schreibe ich auch was auf Seite 189.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?