Methode in einer abgeleiteten Klasse

  • zerm schrieb:

    Amin Negm-Awad schrieb:

    Es geht aber nicht darum, dass du einmal -aendereTitelUndStarteBerechnung hast und einmal aendereTitelOderMachFooUndStarteBerechnung, also verschiedene Tätgkeiten. Das würde ich auch in zwei Methoden packen.

    Es geht darum, dass ich immer eine Berechnung starte, jedoch den Wert woanders her erhalte. Das wäre also in etwa: -macheBerechnungUndNehmeTitel und -macheBerechnungUndNehmeStringValue. Und da siehst du schon, dass die Tätigkeit (macheBerechnung) den Schwerpunkt bildet und die verschiedenen Quellen unnatürlich sind. (Weil Berechnungen nur selten davon abhängen, woher du deine Parameter nimmst.) Du wirst deinem Buchhalter ja auch nicht eine neue Ausbildung spendieren, weil er einmal die Zahlen bei dem Vertrieb und ein anderes mal bei der Produktion abfragen muss.

    Ein gutes Argument. Aber in diesem Fall:
    Ich bin gewöhnt, prinzipiell zu kapseln. Das heisst, wenn meine Berechnung nur ein String bekommt, soll sie gar nicht wissen, wo der herkommt. Optimal wäre, wenn die Klasse gar nicht weiss, was ein NSButton überhaupt ist. Muss sie ja auch nicht.
    Hier könnte man dann meinetwegen eine Kategorie einfügen, die diese Klasse auf Titel von Buttons erweitert. Und eine, die auf sonstwas erweitert.

    Also zunächst einmal scheint mir hier wieder ein Anwendungsfall konstruiert zu werden, der überhaupt keinen Sinn ergibt.
    Warum sollte ich mittels eines Buttons eine Berechnung durchführen und dafür seinen Titel nutzen wollen?

    Nicht einmal der Taschenrechner berechnet beim Drücken auf [1] irgend etwas. Und wenn ich auf [+] drücke, passiert auch erst mal nix. Wenn ich dann nach einer weiteren Ziffernfolge auf [-] drücke, wird addiert...
    Ja, natürlich kann man dann folgendes tun:

    C-Quellcode

    1. -(IBAction)berechneMitOperation:(id)sender
    2. {
    3. [[self mutableOperationsArray] addOperationMatchingString:[sender title]];
    4. if([[self mutableOperationsArray] count] > 1)
    5. {
    6. // Voll die Berechnung mit der beim letzten Methodenaufruf gespeicherten Rechenoperation
    7. [[self mutableOperationsArray] removeObjectAtIndex:0];
    8. }
    9. }


    Diese Methode werde ich aber niemalsnienicht aufrufen, wenn ich meine zu berechnende Formel einfach in ein Textfeld eintippe...

    Wann immer ich selbst und höchstpersönlich etwas mit meinen Objekten tue, also einen genauen Überblick über meine Arbeit habe, solange nutzt mir der ganze Kram nix.
    Interessant und hilfreich wird es erst dann, wenn ich keine Kontrolle mehr über die übergebenen Objekte habe. Zum Beispiel, wenn ich Objekte aus einer Sammlung bekomme, die Objekte unterschiedlichen Typs aufnimmt.

    Nehmen wir beispielsweise eine eigene Implementierung im Stile der iTunes Bibliothek.
    Ich habe irgendwo in dem ArrayController der Datasource ein Objekt markiert und möchte dieses abspielen.

    C-Quellcode

    1. //Musike reagiert hier auf -playFromStartPosition:enableFade:
    2. // Filmchen reagiert hier auf -playFromStartPosition:enableFullscreenMode:
    3. // PDF reagiert hier auf -open
    4. // Dynamisch typisiert
    5. -(IBAction)playSelectedItem:(id)sender
    6. {
    7. id item = [dataSourceDelegate selectedObject];
    8. if([item respondsToSelector:@selector( playFromStartPosition:enableFade: )])
    9. {
    10. [item playFromStartPosition:0.00 enableFade:YES];
    11. }
    12. if([item respondsToSelector:@selector( playFromStartPosition:enableFullscreenMode: )])
    13. {
    14. // Später starten, ist immer ein doofes Intro vorgeschaltet. ;)
    15. [item playFromStartPosition:3.5 enableFullscreenMode:NO];
    16. }
    17. if([item respondsToSelector:@selector( open )])
    18. {
    19. [item open];
    20. }
    21. }
    Alles anzeigen


    Wie das jetzt mit statischer Typisierung aussehen soll weiß ich gar nicht so genau... Vermutlich irgendwie so in der Art:

    C-Quellcode

    1. -(IBAction)performWithItem:(id)sender
    2. {
    3. RootItem* item = [dataSourceDelegate selectedObject];
    4. if([item isKindOfClass:[MusicItem class]]) {
    5. [(MusicItem*)item playFromStartPosition:0.00 enableFade:YES];
    6. }
    7. if([item isKindOfClass:[MovieItem class]]) {
    8. // Später starten, ist immer ein doofes Intro vorgeschaltet. ;)
    9. [(MovieItem*)item playFromStartPosition:3.5 enableFullscreenMode:NO];
    10. }
    11. if([item isKindOfClass:[PDFItem class]]) {
    12. [(PDFItem*)item open];
    13. }
    14. }
    Alles anzeigen


    Packen wir jetzt noch ein ImageItem mit Methode -open hinzu, brauchst du bei der dynamischen Variante mit id wie schon erwähnt nix tun, die statische Variante musst du erweitern. Packst du hingegen noch ein BookItem mit der Methode -read dazu, musst du wieder beide Varianten anpassen.

    Im zweiten Beispiel weiß deine Methode immer, mit wem sie es zu tun hat. Im ersten Beispiel hingegen nicht. Da weiß sie nur, mit welcher Nachricht das Objekt etwas anfangen kann

    Wie würdest du das 'starr' typisieren wollen, vor Allem in Hinblick auf die Kapselung?
    Meiner Meinung nach ist das erste Bibliothekenbeispiel schon sehr gut gekapselt.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Lucas de Vil schrieb:

    Amin Negm-Awad schrieb:


    Michse schrieb:


    Nicht dein Lösungsansatz war Schwachsinn, sondern das Konstrukt deines 'Einstellungsgespräches'.
    Trotz zitierter Stelle siehst du es wieder im Gültigkeitsbereich des kompletten Threads, was es aber nicht ist.

    Ach komm, ich geb's auf.

    Ich hatte dir den Grund für das Beispiel in einem gesonderten Beitrag noch einmal mit Hervorhebung erläutert. Du wirst sehen, dass es mir gerade nicht auf die konkreten Tätigkeiten und Ausbildungen ankommt, sondern darauf, dass man das überhaupt vermischt.

    Vielleicht solltest du auch diesen Beitrag noch einmal lesen.
    osxentwicklerforum.de/index.php?p…4909#post124909

    Ich weiß, dass du das zusammengefasst hast. Wenn man weiß, dass du explizit auf die Vermischung hinweist, dann ist es in tatsächlich offensichtlich.
    Hast du aber nicht.

    Das ist falsch:
    "Er fragt nach einer Methode (-respondsToSelector:). Wenn er nach einer Methode fragt, fragt er nach einer Fähigkeit, nicht nach einem Typen. Deshalb ist es in seinem Code fehlerhaft, überhaupt zu typisieren. "

    Stellt sich nur die Frage, ob du das nicht gelesne hast oder nicht gelesen haben willst. Egal, du kannst es ja einfach aus dem Zitat löschen.

    Lucas de Vil schrieb:

    [Ich zitiere dich selbst:

    Amin Negm-Awad schrieb:

    Sein Einstellungsgespräch lautet in etwa:
    Frage: "Können Sie tippen?" (= Frage nach einer Methode -tippen)
    Antwort: "Ja!"
    Frage: "Gut,da Sie eine Sekretärin sind, können Sie auch Kaffee kochen." (= Fehlerhafte Unterstellung, dass daraus der Typ Sekretärin folgt)
    Antwort: "????"

    Aber fwtag weigert sich ja hartnäckig, Objective-C zu lernen …

    Hier wäre der Hinweis "Du vermischt dynamische und statische Typisierung, das kann nix werden." anstelle des Rumgeflames angebracht, um sämtliche Verwirrungen von vorn herein auszuschließen. Das hätte vermutlich auch dafür gesorgt, dass dir niemand Rumreiterei auf unwichtigen Details unterstellt hätte.

    Die Unterstellungen von irgendwelchen Collections stammt von dir. Sie ist zudem sachfremd und durch nichts angebracht.

    Was habe ich denn unterstellt? Du weigerst dich ja, dass konkret zu bennen.

    Lucas de Vil schrieb:

    [Dein indirektes Umherunterstellen in der dritten Person in einem Beitrag, der damit eigentlich nüscht zu tun hat ohne mich direkt anzusprechen lasse ich einfach unkommentiert. Obwohl, nicht ganz. Du bekommst dafür von mir ein weiteres :rolleyes:.

    Ui, ein Smiley als Strafe. Ich fühle mich tief getroffen.

    Was meinst du? Schaffst du es diesmal den Beitrag zu lesen, bevor du darauf antwortest?
    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"?
  • Amin Negm-Awad schrieb:


    Das ist falsch:
    "Er fragt nach einer Methode (-respondsToSelector. Wenn er nach einer Methode fragt, fragt er nach einer Fähigkeit, nicht nach einem Typen. Deshalb ist es in seinem Code fehlerhaft, überhaupt zu typisieren. "

    Stellt sich nur die Frage, ob du das nicht gelesne hast oder nicht gelesen haben willst. Egal, du kannst es ja einfach aus dem Zitat löschen.

    Da steht "Du sollst nicht mischen!"? Dann muss es Option 3 sein: es ist für mich einfach nicht als Solches erkennbar.

    Wie dem auch sei, diese zitierte Stelle steht mindestens drei Sätze oder einen Absatz vor dem von mir als sinnlos definierten konstruierten Einstellungsgespräch.
    Insofern ist da nüscht aus dem Zitat gelöscht. Anderer Absatz, anderer Antwortbereich.
    Ich zitiere doch nicht deinen kompletten Beitrag, wenn ich mich nur auf einen Teil davon beziehe. Vermutlich wirst du mir jetzt vorwerfen, ich reiße damit alles aus dem Kontext. Um Ausflüchte bist du ja selten verlegen.
    Dem werde ich dann entgegnen, dass du deine Kontexte in sich schlüssig aufbauen solltest. Anschließend wirst du mir raten, einfach deine Beiträge zu lesen. Daraufhin entgegne ich dann gar nichts mehr, denn das ist mir zu müßig.

    Amin Negm-Awad schrieb:


    Lucas de Vil schrieb:

    Ich zitiere dich selbst:

    Amin Negm-Awad schrieb:

    Sein Einstellungsgespräch lautet in etwa:
    Frage: "Können Sie tippen?" (= Frage nach einer Methode -tippen)
    Antwort: "Ja!"
    Frage: "Gut,da Sie eine Sekretärin sind, können Sie auch Kaffee kochen." (= Fehlerhafte Unterstellung, dass daraus der Typ Sekretärin folgt)
    Antwort: "????"

    Aber fwtag weigert sich ja hartnäckig, Objective-C zu lernen …

    Hier wäre der Hinweis "Du vermischt dynamische und statische Typisierung, das kann nix werden." anstelle des Rumgeflames angebracht, um sämtliche Verwirrungen von vorn herein auszuschließen. Das hätte vermutlich auch dafür gesorgt, dass dir niemand Rumreiterei auf unwichtigen Details unterstellt hätte.

    Die Unterstellungen von irgendwelchen Collections stammt von dir. Sie ist zudem sachfremd und durch nichts angebracht.

    Was habe ich denn unterstellt? Du weigerst dich ja, dass konkret zu bennen.

    Wie kommst du denn auf Grund meines Zitates jetzt auf Collections? Weil ich irgendwann später auf Objekte einer Collection zugegriffen habe, um für mich ein Beispiel zu konstruieren, in dem ich die Vorzüge der dynamischen Typisierung irgendwie erkennbar gestalten wollte? Laut gedacht, mein Großer, laut gedacht.
    Aber du hast natürlich Recht, die Nutzung von Collections ist völlig sachfremd und durch nichts angebracht. So etwas nutzt mensch ja nie, schon gar nicht mit Objekten unterschiedlicher Klassen.

    Du hast fwtag unterstellt, er weigere sich hartnäckig, Objective-C zu lernen. Steht doch da.

    Amin Negm-Awad schrieb:

    Sein Einstellungsgespräch lautet in etwa:
    Frage: "Können Sie tippen?" (= Frage nach einer Methode -tippen)
    Antwort: "Ja!"
    Frage: "Gut,da Sie eine Sekretärin sind, können Sie auch Kaffee kochen." (= Fehlerhafte Unterstellung, dass daraus der Typ Sekretärin folgt)
    Antwort: "????"

    Aber fwtag weigert sich ja hartnäckig, Objective-C zu lernen …

    Die von mir als Unterstellung angesehene Stelle von mir hervorgehoben

    Wie du jetzt von 'Hier wäre der Hinweis "Du vermischt dynamische und statische Typisierung, das kann nix werden." anstelle des Rumgeflames angebracht, um sämtliche Verwirrungen von vorn herein auszuschließen. Das hätte vermutlich auch dafür gesorgt, dass dir niemand Rumreiterei auf unwichtigen Details unterstellt hätte.' darauf kommst, du hättest etwas unterstellt, erschließt sich mir nicht ganz. Obwohl ich deinen Beitrag mehrmals gelesen habe. Naja, vielleicht ist 'Buchstaben wortweise zusammenziehen' ja Lesen 1.0 und mit deiner Version Schreiben 2.5 inkompatibel, wer weiß.

    Amin Negm-Awad schrieb:


    Lucas de Vil schrieb:

    Dein indirektes Umherunterstellen in der dritten Person in einem Beitrag, der damit eigentlich nüscht zu tun hat ohne mich direkt anzusprechen lasse ich einfach unkommentiert. Obwohl, nicht ganz. Du bekommst dafür von mir ein weiteres :rolleyes:.

    Ui, ein Smiley als Strafe. Ich fühle mich tief getroffen.

    Was meinst du? Schaffst du es diesmal den Beitrag zu lesen, bevor du darauf antwortest?

    Du fühlst dich tief getroffen? Oh weh, das sollte nicht passieren. Ich bitte vielmals um Entschuldigung und biete als Wiedergutmachung ein :huh: an.

    Selbstverständlich schaffe ich das. Auch wenn ich davon ausgehen muss, dass du wieder irgendwelche Stellen finden wollen wirst, die dich das Gegenteil vermuten lassen.
    Nach deinem nächsten Beitrag werde ich übrigens einen erhöhten Schwierigkeitsgrad probieren.
    Ich werde deinen Beitrag lesen und nicht darauf antworten. Mal sehen, ob ich das schaffe.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Amin Negm-Awad schrieb:

    Die beiden Lösungsmöglichkeiten:

    1: Typisiert (Sein) + Downcast:

    Quellcode

    1
    2
    3
    4
    5



    BaseClass* instance = …
    if( [instance isKindOfClass:[subclass1 class] ) { // Frage nach dem TYPEN, Methode interessiert nicht
    [(Subclass1*)instance doSomethingSubclass1CanDo]; // Downcasting auf den TYPEN
    } else if( [instance isKindOfClass:[subclass2 class] ) {




    2: Typlos, Konzentration auf Methoden

    Quellcode

    1
    2
    3
    4
    5



    id instance = … // typ interessiert nicht
    if( [instance respondsToSelector:@selector( doSomethingSomeoneCanDo ) ) { // Frage nach der METHODE, Typ interessiert nicht
    [instance doSomethingSomeoneCanDo]; // Ausführung der METHODE, kein Downcast, weil der Typ inicht interessiert.
    } else if( [instance respondsToSelector:@selector( doSomethingSomeoneCanDo ) ) {

    Lieber Amin, genau das war die Info, die ich hatte haben wollen. Danke! (Ich hatte übrigens das Downcasting dann auch relativ schnell intuitiv so implementiert - allerdings habe ich erst jetzt Benennung und Hintergründe gelernt - und verstanden!).
    Im Übrigen gebe ich Dir völlig Recht: Die Methode einfach "start" zu nennen, ist schlecht. Das werde ich ebenfalls ändern.

    Für mich ist der Thread nun erledigt. Geht ein Bier trinken! ;)
  • fwtag schrieb:

    (Ich hatte übrigens das Downcasting dann auch relativ schnell intuitiv so implementiert - allerdings habe ich erst jetzt Benennung und Hintergründe gelernt - und verstanden!).

    Verstehe ich das richtig, dass du am Downcast und damit an den Klassen festhältst?
    Falls ich das richtig verstehe: warum tust du das und machst es nicht dynamisch? :huh:

    fwtag schrieb:


    Für mich ist der Thread nun erledigt. Geht ein Bier trinken! ;)

    Und das, wo ich seit vier Wochen dabei bin den Alkohol sein zu lassen...
    Ich trink nen Apfelsaft, okay? ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Lucas de Vil schrieb:

    Falls ich das richtig verstehe: warum tust du das und machst es nicht dynamisch? :huh:

    Lies doch mal, was ich geschrieben habe!! ;)

    Nein, ich war das Wochenende unterwegs und habe schon Freitag intuitiv das Downcasting implementiert, seitdem aber nichts mehr an dieser Sache gemacht. Ich muss aber noch ein wenig darüber nachdenken und ein paar Tests machen, was in meinem Fall am besten hinhaut.

    ##EDIT:
    Ich habe das auf die dynamische Variante mit "id" umgestellt und auch die Start-Methode umbenannt. Das hat das Problem gelöst und ist im Übrigen auch tatsächlich die eleganteste Variante.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von fwtag ()

  • fwtag schrieb:

    Amin Negm-Awad schrieb:

    Insofern habe ich nur zurückgegeben, was ich bekam. Quatsch natürlich. Ich habe ihm schon häufig geholfen, er mir noch nie.

    Bitte sage mir, wo ich Dir helfen kann, und ich helfe gern. Leider werde ich Dir aber nie bei Objective-C helfen können - da sind wir uns wohl einig.

    Ich erwarte auch gar nicht, dass du mir hilfst. Zumal ich hier wirklich (fast) nur wegen Objective-C unterwegs bin.

    Ich erwarte allerdings eine andere Einstellung, als dein oben zitierter Beitrag erkennen lässt.
    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"?
  • Amin Negm-Awad schrieb:

    Ich erwarte allerdings eine andere Einstellung, als dein oben zitierter Beitrag erkennen lässt.

    Ach, weißt Du, ich erwarte einen anderen Ton, wenn man mit mir spricht, und vor allem, dass man nicht in selektiver Wahrnehmung das ausschlaggebende ";-)" in genanntem Zitat übersieht. Aber wünschen kann man sich ja viel und man muss eben nehmen, was man bekommt.

    Es zwingt Dich ja keiner, Dich mit mir abzugeben, wenn Du meine vermeintlichen "Majestätsbeleidigungen" nicht ertragen kannst. Allerdings muss ich sagen, dass Du schon eine ziemlich niedrige Reizschwelle hast. Bei dem, was Du auf dem Kasten hast, sollte man meine, dass Du meilenweit über solchen Dingen stehst.

    Ich für meinen Teil werde jedenfalls Deine Großspurigkeit weiter ignorieren. Dein Buch ist Klasse, der Kern Deiner Beiträge auch, aber der Rest drumherum - naja, damit müssen Du und die Leute, die Dich kennen, klar kommen.
  • fwtag schrieb:

    Amin Negm-Awad schrieb:

    Ich erwarte allerdings eine andere Einstellung, als dein oben zitierter Beitrag erkennen lässt.

    Ach, weißt Du, ich erwarte einen anderen Ton, wenn man mit mir spricht, und vor allem, dass man nicht in selektiver Wahrnehmung das ausschlaggebende ";-)" in genanntem Zitat übersieht. Aber wünschen kann man sich ja viel und man muss eben nehmen, was man bekommt.

    Eben.

    fwtag schrieb:

    Es zwingt Dich ja keiner, Dich mit mir abzugeben,

    Eben.

    fwtag schrieb:

    wenn Du meine vermeintlichen "Majestätsbeleidigungen" nicht ertragen kannst. Allerdings muss ich sagen, dass Du schon eine ziemlich niedrige Reizschwelle hast. Bei dem, was Du auf dem Kasten hast, sollte man meine, dass Du meilenweit über solchen Dingen stehst.

    Komische Ansicht di du da hast: Ein anständiger Ton nur gegenüber Majestäten?

    fwtag schrieb:

    Ich für meinen Teil werde jedenfalls Deine Großspurigkeit weiter ignorieren. Dein Buch ist Klasse, der Kern Deiner Beiträge auch, aber der Rest drumherum - naja, damit müssen Du und die Leute, die Dich kennen, klar kommen.

    Eben.
    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"?