<Split aus "C/C++ oder C#">



  • Optimizer: natürlich kann man vollständig auf MI verzichten (man kann sogar auf OO verzichten!). Das ist nicht die Frage. Aber wenn es so ist, daß ich ohne MI ähnliche Sachen 2-3mal implementieren muß, dann ist das blöd. Code-Duplikation ist mit das ekligste was es gibt. Und genau das ist der Fall wo ich sage: ich brauche MI. Weil ohne muß ich was unschönes machen.
    Letztlich haben wir doch all diese schönen Features die uns moderne Sprachen bieten nur zu einem Zweck: um unschönen Kram zu vermeiden bzw. wenigstens automatisch gemacht zu kriegen.

    MI wird oftmals falsch eingesetzt, das stimmt. Vererbung auch. Aber wenn man weiß was man tut dann ist es eine feine Sache. Und wenn man jetzt in der Situation ist ein wirklich gutes Design mit MI zu sehen und das aber in eine Sprache gießen muß die es nicht hat, dann ist das einfach ärgerlich.



  • Möchte mich nochmal dafür aussprechen, "Neuigkeiten aus der realen Welt" und "Bullshit/Flamewar/Troll" zu trennen... alle schmeißen ihren Müll hier rein... 😞



  • Optimizer: natürlich kann man vollständig auf MI verzichten (man kann sogar auf OO verzichten!). Das ist nicht die Frage. Aber wenn es so ist, daß ich ohne MI ähnliche Sachen 2-3mal implementieren muß, dann ist das blöd. Code-Duplikation ist mit das ekligste was es gibt.

    Volle Zustimmung. Ich mag Code-Duplizierung auch nicht.

    Und wenn man jetzt in der Situation ist ein wirklich gutes Design mit MI zu sehen und das aber in eine Sprache gießen muß die es nicht hat, dann ist das einfach ärgerlich.

    Hmmmmm, jain. Unterschiedliche Sprachen können unterschiedliches Design erfordern. Das ist ärgerlich, aber definitiv nicht zu ändern.
    Ich halte MI nicht für einen Designfehler (um das nochmal klarzustellen). Ich halte es aber für einen Designfehler, eine Klassenhierarchie zu haben, die nichts anderes erlaubt, als Implementierung über MI, ohne 50mal Code zu duplizieren.

    Ich bin kein Philosoph und kenne nicht die genaue Ursache wie und wann und wo man in so eine Situation kommt. Tatsache ist aber, dass Verzicht auf MI nicht automatisch Codeduplizierung bedeutet. Das Java API ist unglaublich fett (verdammt madig unglaublich hardcore fett ⚠ ). Da ist garantiert keine Mehrfachvererbung drin. Und ganz bestimmt auch keine Codeduplizierung. Irgendwas läuft IMHO falsch, wenn man MI wirklich braucht.
    Wenn man MI benutzt, sollte man eine akzeptable Alternative zur Hand haben und trotzdem seine guten Gründe haben, es zu benutzen. Finde ich. Aber überhaupt keine Alternative zu sehen, das kommt mir schon wirklich nicht geheuer vor. 🙂

    'Mehrfachvererbung' und 'MI' soll hier jetzt "Mehrfachvererbung von Implementierungen" bezeichnen.

    HEZ schrieb:

    Möchte mich nochmal dafür aussprechen, "Neuigkeiten aus der realen Welt" und "Bullshit/Flamewar/Troll" zu trennen... alle schmeißen ihren Müll hier rein... 😞

    Danke, dass du dazu beiträgst, das Niveau zu heben.



  • Optimizer schrieb:

    [...]
    Das eine Objekt mehrere Dinge sein kann, ist klar. Das lässt sich aber auch z.B. in Java implementieren.
    (Wohnmobil extends Fahrzeug implements Wohnstätte. Ein Wohnmobil lässt sich jetzt sowohl als Fahrzeug als auch als Wohnstätte behandeln.)
    [...]

    ich würde eher sagen ein Wohnmobil ist ein Fahrzeug mit einer Wohnung.
    Ist ein Fahrzeug, hat eine Wohnung.
    Somit abgeleitet von Fahrzeug mit der Eigenschaft Wohnung.
    Einfachvererbung



  • Hmmmm guter Einwurf. Wie immer hängt es natürlich vom Programm ab. Es kann auch unklug sein, Pinguin von Vogel abzuleiten.

    Jetzt muss man aber den Begriff genau differenzieren.
    Wenn eine Wohnung eine Adresse hat, trifft das tatsächlich nicht mehr auf Wohnmobile zu. Dann könnte eine Wohnung aber genauso nicht alleine stehen, sondern müsste auch ein Member eines Hauses sein.

    Ich sagte aber Wohnstätte. Ein Haus ist eine Wohnstätte (bietet Unterkunft, enthält ein Bett), genauso wie ein Wohnmobil. Kommt wieder darauf an, wie man Wohnstätte definiert, aber IMHO muss das nicht zwangsläufig sowas wie ein Haus sein. Könnte auch ein verwahrloster Platz unter einer Brücke sein. Ich hatte Wohnstätte nicht zuletzt deshalb als abstrakt bezeichnet.

    Ein Wohnmobil muss nicht fahrfähig sein. Vielleicht macht es Sinn, von Wohnmobil ein fahrtüchtiges Wohnmobil abzuleiten. Kann man wohl nicht allgemein sagen. Lass es mal als Beispiel gelten. 🙂



  • Optimizer schrieb:

    HEZ schrieb:

    Möchte mich nochmal dafür aussprechen, "Neuigkeiten aus der realen Welt" und "Bullshit/Flamewar/Troll" zu trennen... alle schmeißen ihren Müll hier rein... 😞

    Danke, dass du dazu beiträgst, das Niveau zu heben.

    Sorry, habe ehrlich nicht gedacht, dass ihr die Kurve wieder kriegt... 🙂



  • Optimizer schrieb:

    Ich halte es aber für einen Designfehler, eine Klassenhierarchie zu haben, die nichts anderes erlaubt, als Implementierung über MI, ohne 50mal Code zu duplizieren.

    Aber wenn ich eine Klassenhierarchie habe, dann ist da entweder MI drin oder nicht. Eine Implementierung ohne MI wird eine andere Struktur haben als die Implementierung mit.

    Ein Beispiel wo man MI wirklich gut gebrauchen kann ist, wenn man eine Klasse schreiben will, die mit zwei Bibliotheken zusammenarbeitet. Sie muß also zwei Interfaces anbieten und vielleicht am besten auch gleich noch die passende Default-Implementierung einiger Methoden. Insbesondere wenn man die beiden Libs nicht selbst geschrieben hat wird das schwierig.



  • Jester:
    http://www.artima.com/intv/dotnet.html

    .NET wird also mit ziemlich großer Wahrscheinlichkeit keine Mehrfachvererbung haben - das hindert die einzelnen Sprachen aber nicht daran trotzdem eine anzubieten 😉



  • Aber wenn ich eine Klassenhierarchie habe, dann ist da entweder MI drin oder nicht. Eine Implementierung ohne MI wird eine andere Struktur haben als die Implementierung mit.

    Ja. Aber die muss nicht zwangsläufig redundanter sein. Dass man bei verschiedenen Sprachen evtl. das Design ändern muss, haben wir ja schon festgestellt.

    wenn man eine Klasse schreiben will, die mit zwei Bibliotheken zusammenarbeitet. Sie muß also zwei Interfaces anbieten und vielleicht am besten auch gleich noch die passende Default-Implementierung einiger Methoden.

    Ist doch halb so schlimm, wenn sie keine Default-Implementierung liefert. Angenommen die eine "Bibliothek" ist eine Art sortierte Datenbank, dann muss meine Klasse halt z.B. das Interface 'CompareableObject' implementieren.
    Was für einen Sinn würde es jetzt machen, jetzt eine Default-Implementierung für alle Compareable-Klassen zu liefern?
    Da wir ja tolle MI verwenden, können das völlig unterschiedliche Objekte sein, du kannst aber nicht für Sockets eine ähnliche Default-Implementierung zum Vergleichen liefern wie für Rationale Zahlen. Bei Mehrfachvererbung muss ja keineswegs irgendeine großartige Beziehung zwischen zwei "benachbarten" Klassen im Vererbungsgraph bestehen, außer eben, was die Basisklasse vorgibt.

    Du kannst die Methoden wenn du Pech hast fast immer redefinieren. Seltsamerweise stoße ich auf sowas bei meinen Überlegungen dauernd.

    Wenn ich jetzt dagegen verschiedene Arten von Zahlenklassen angucke, da könnte es wirklich Sinn machen, eine Default-Implementierung für compare() zu liefern, nämlich den Betrag vergleichen.
    Dann schreib ich diese Implementierung aber in eine Basisklasse Number und nicht nicht CompareableObject.

    Ich hoffe, es ist klar, was ich meine. Es geht mir darum, dass man fast immer ohne Verbiegen noch eine Zwischenklasse finden kann, die dann Defaultimplementierungen liefern kann.

    Vielleicht kannst du ja dein Beispiel auch mehr konkretisieren, damit es klarer wird. Irgendwas mit zwei Bibliotheken ist halt noch nicht sehr konkret. Es ist btw. angeblich erwiesen, dass Mehrfachvererbung nicht mächtiger ist als Einfachvererbung.
    In Anbetracht dessen, mit was für Nachteilen man sich das erkauft, kann man wirklich schon fast darauf verzichten. Die armen C++ Compilerbauer. *kopfschüttel* 🤡



  • Natürlich ist sie nicht mächtiger. Einfachvererbung ist auch nicht mächtiger als garkeine Vererbung. Aber das geht am Thema vorbei.
    Wenn Du jetzt natürlich ein beliebiges Beispiel anführst bei dem man's nichts braucht dann sagt das darüber, ob es Fälle gibt wo man's braucht gerade mal garnichts aus.

    Nimm doch mal an Du hast eine Bibliothek. Damit Du mit der arbeiten kannst mußt Du von einer Basisklasse arbeiten. Und bei einer zweiten Bibliothekt genauso. Uned jetzt möchtest Du eine Klasse bauen, die von beiden Bibliotheken polymorph verwendet wird. Dann hast Du eine Situation wo Du ohne MI nicht so gut wegkommst.

    MfG Jester



  • Jester schrieb:

    Natürlich ist sie nicht mächtiger. Einfachvererbung ist auch nicht mächtiger als garkeine Vererbung. [...]

    ohoh...ich wette das ist ein Gerücht.



  • Jester schrieb:

    Nimm doch mal an Du hast eine Bibliothek. Damit Du mit der arbeiten kannst mußt Du von einer Basisklasse arbeiten. Und bei einer zweiten Bibliothekt genauso. Uned jetzt möchtest Du eine Klasse bauen, die von beiden Bibliotheken polymorph verwendet wird. Dann hast Du eine Situation wo Du ohne MI nicht so gut wegkommst.

    Wenn man keine MI hat, dann programmiert man doch ganz anders. Geht übrigens super aus meinem Link hervor 😉

    Ich war auch noch nie in einer Situation wo ich von 2 verschiedenen Bibliotheken gleichzeitig erben wollte - und wenn man das muss und keine MI hat - dann hat man Interfaces 😉

    Es sind einfach 2 unterschiedliche herangehensweisen. Ich denke dass es sinnlos ist darüber zu reden ob man MI braucht oder ob Interfaces reichen. Es sind einfach 2 komplett verschiedene Wege ein Problem zu lösen. Deshalb sehen Klassenhierachien in Java meistens anders aus als in C++ 😉



  • *unterschreib*

    Ist glaub ich das beste Ergebniss, was wir hieraus ziehen können.



  • Jo, lassen wir es dabei.

    Online: Mit welchen Opcodes unterstütz Dein Prozessor Vererbung?



  • Jester schrieb:

    Jo, lassen wir es dabei.

    Online: Mit welchen Opcodes unterstütz Dein Prozessor Vererbung?

    👍 na dann....ran an ASM.

    wenn du meinst das Mächtigkeit sich nur in der Ausführung des Codes wiederspiegelt ok.
    Aber was ist mit der Programmierung? Ohne Vererbung könntest du die Klassen nicht einfach weiterverwenden nur kopieren und was ist wenn du jetzt in der Klasse nach Monaten was ändern musst und du den COde dann schon einige male kopiert hast da ist nix mehr mit Basisklasse schnell mal reperieren...also ist das für mich auch Mächtig.
    Was ist mit Polymorphie? Ohne Vererbung nichts zu machen. Das ist auch Mächtig für mich.

    Ob jetzt Merfachvererbung mehr bringt als einfach sei dahingestellt. Aber ohne Vererbung. OOP-Model dahin



  • Ja, das will ich ja auch nicht bestreiten. Ich wollte hauptsächlich darauf hinweisen, daß es nicht wirklich sinnig ist in diesem Zusammenhang von "mächtiger" zu sprechen ohne das genauer zu definieren. Wenn wir meinem was man damit für Programme schreiben kann, dann ist die Antwort einfach: mit jedem sind alle möglich. Deshalb kann keine Vererbung nicht weniger als Vererbung. Sie sind also in diesem Sinne gleichmächtig.

    Ein anderes quantitatives Kriterium fällt mir ehrlich nicht ein. Wir können schlecht darüber diskutieren wie "schön" etwas ist. Zumindest nicht wenn wir einen objektiven Vergleich haben wollen. Aber wenn Dir ein gutes Kriterium einfällt immer her damit.



  • Jester schrieb:

    [...]
    Wenn wir meinem was man damit für Programme schreiben kann, dann ist die Antwort einfach: mit jedem sind alle möglich. Deshalb kann keine Vererbung nicht weniger als Vererbung. Sie sind also in diesem Sinne gleichmächtig.
    [...]

    jop du hast da natürlich recht. Mit jedem kann man jedes Programm schreiben
    aber schreiben ist nicht gleich schreiben, es geht auch um den Aufwand denn ich betriebn muss. Und in der heutigen Kultur heißt Aufwand Zeit und Zeit ist Geld und Geld hat niemand...

    Vererbung macht vieles einfacher und somit schneller im sinne des fertigstellens des Programms und der Wartbarkeit und dadurch produktiver

    wie du immer Mächtigkeit definierst. Eine Programmiersprache zeichnet sich nicht nur dadurch aus das man am ende ein schnelles Programm hat. Der Weg dahin ist meistens entscheidender. Vererbung hat da nun viele Vorteile



  • Mir ging es auch nicht Geschwindigkeit. Wenn ich sage A ist mächtiger als B, dann heißt das für micht: Mit A kann man mehr machen als mit B. Und das funktioniert in diesem Szenario einfach nicht.

    Wir könnten natürlich sagen: mit Vererbung kann man schneller entwickeln als ohne... das ist aber wohl nicht immer richtig (Ausnahmen bestätigen schließlich die Regel), und zum Zweiten hilft uns das nicht viel weiter. Denn auf die Frage ob man mit MI jetzt schneller entwickeln kann als ohne... tja, da entsteht höchstens ein Glaubenskrieg aber kein guter Vergleich.



  • Jester schrieb:

    Natürlich ist sie nicht mächtiger. Einfachvererbung ist auch nicht mächtiger als garkeine Vererbung. [...]

    nun ich bin auf diesen Satz von dir eingegangen weil ich mächtiger = besser gesetzt hab.

    und ich bin der meinung das Vererbung um längen besser ist als keine Vererbung. Aber das ist meine Meinung.

    Natürlich gibts Gründe wo ich selbst sagen würde: Vererbung, wofür?

    Mir ging es auch nicht Geschwindigkeit. Wenn ich sage A ist mächtiger als B, dann heißt das für micht: Mit A kann man mehr machen als mit B. Und das funktioniert in diesem Szenario einfach nicht.

    Ich kann mehr Programme schreiben als du weil ich durch Vererbung Zeit einsparre 😉

    jetzt mal im ernst:
    warum sollst du mit Vererbung nicht mehr machen können als ohne?
    Mit Vererbung kann ich mich der Natur annähren
    Ich kann mir eine Klassenstruktur aufbauen
    (und dann noch die wieteren Punkte die ich schon aufgeschrieben hab)

    Alleine Polymorphie wiederspricht deiner Aussage ("Wenn ich sage A ist mächtiger als B, dann heißt das für micht: Mit A kann man mehr machen als mit B. Und das funktioniert in diesem Szenario einfach nicht.")

    gut, wenn du alles auf den gemeinsammen Nenner bringen willst:

    Mit welchen Opcodes unterstütz Dein Prozessor Vererbung?

    dann kann keine Programmiersprache mehr als alle die anderen. Sind doch alles sowieso Bits



  • Wir reden glaub ich aneinander vorbei: ich hab nie bestritten, daß Vererbung sinnvoll ist. Aber versuch mal das quantitativ zu fassen!

    Meßbar ist: was ist realisierbar. Antwort: mit Vererbung alles und ohne auch. => kein Unterschied

    also brauchen wir einen andere Maßstab. Nehmen wir Entwicklungsgeschwindigkeit. Prima man könnte also sagen mit Vererbung kann man schneller entwickeln also ohne.

    Gut, eigentlich wollten wir mi mit si vergleichen. Kann man jetzt ohne mi schneller entwickeln also mit mi?
    Tja keine Ahnung, man kann das einfach nicht objektiv vergleichen. Der eine sagt so, der andere so.

    Nebenbei bemerkt: ich hatte bei "mächtiger als" zunächst nen anderen Begriff im Kopf. Der besagt aber, daß ich mit dem einen genau das andere auch nachbauen kann. Sozusagen als Spezialfall enthalten. Das konnte aber nicht sein, da sonst mi mächtiger wäre als si und umgekehrt nicht. Das konnte Optimizer also nicht gemeint haben.

    Letztlich ist es also schlicht quatsch zu versuchen die Mächtigkeit von sowas als formales Argument anzuführen. Mehr will ich garnicht sagen.
    Aber zu sagen: "mit Vererbung kann man viel mehr machen, das müßte man ja sonst alles von Hand zusammenbasteln..." und andererseits: "mi braucht man nicht, kann man mit si alles zusammenbasteln." ist doch irgendwie schizophren, oder?


Anmelden zum Antworten