<Split aus "C/C++ oder C#">
-
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?
-
Letztlich ist es also schlicht quatsch zu versuchen die Mächtigkeit von sowas als formales Argument anzuführen.
also wenn du vorher nicht definierst was du unter mächtig verstehst ist es wohl zuerst als Vergleich zu sehen
und ein Vergleich setzt nun mal pro/contra aussagen voraus. Du hast mit deiner Aussage Verergung == nicht Vererbung gesetzt also sind die gleichwertig. Das können sie aber nur sein wenn sie in allen Punkten gleich sind. Das sind wir uns wohl Einig das das nicht der Fall sein kann.
welche Rolle die Mehrfachvererbung nun gegenüber der Vererbung spielt...das kann ich dir nicht sagen, darum ging es mir auch nie.
Villeicht hab ich dich wirklich falsch verstanden...
aber:
was ist realisierbar. Antwort: mit Vererbung alles und ohne auch. => kein Unterschied
diese Aussage ist wohl absolut Relativ. Es stellt sich nicht die Frage was ist realisierbar sondern was will ich machen und wie kann ich es realisieren.
Wie willst du .Net z.B. realiesieren mit dem Konzept das es beinhaltet. Es bassiert absolut auf Vererbung, also wäre es ohne diese nicht zu realisieren!
-
Wenn man nicht definiert was "gleichmächtig" heißt, dann kann man auch nicht sagen wann zwei Dinge gleichmächtig sind. Ich habe also mal eine Definition zugrundegelegt. Und zwar eine die man wenigstens ordentlich nachprüfen kann. Und es kam irgendwie nichts brauchbares raus. Wenn wir aber ein Definition wählen die nicht nachprüfbar ist, dann kann jeder alles behaupten und wir sind kein Stück weiter.
Realisierbar sollte hier heißen: Welche denkbaren Programme sind damit implementierbar. Im Sinne von Turing-Mächtigkeit. Das ist Absolut, nicht relativ.

Wie gesagt, wenn Dir eine schlaue Vergleichsmöglichkeit einfällt, die *nicht* subjektiv ist und die sich einfach nachprüfen läßt... nur her damit. Ich finde keine. Und ich glaube auch nicht, daß es wirklich ne gute gibt. Darauf wollte ich hinweisen.
-
Jester schrieb:
[...]
Realisierbar sollte hier heißen: Welche denkbaren Programme sind damit implementierbar. Im Sinne von Turing-Mächtigkeit. Das ist Absolut, nicht relativ.

ich könnte jetzt behaupten das du deine allgemeine Aussage jetzt so subjektiv umformst das sie deinen Kriterien entspricht

Wie gesagt, wenn Dir eine schlaue Vergleichsmöglichkeit einfällt, die *nicht* subjektiv ist und die sich einfach nachprüfen läßt... nur her damit. Ich finde keine. Und ich glaube auch nicht, daß es wirklich ne gute gibt. Darauf wollte ich hinweisen.
Man kann kein abgeschlossenes System messen. Jede Messung hat einen subjektiven Einfluss auf das Ergebnis.
-
Online schrieb:
Man kann kein abgeschlossenes System messen. Jede Messung hat einen subjektiven Einfluss auf das Ergebnis.
Wenn ich eine zwei Programmiersprachen habe kann ich mir anschaun ob beide Turing-Mächtig sind. Ist es eine nicht, so ist die andere klar mächtiger. Wo da irgendwelche subjektiven Einflüsse reinkommen ist mir schleiferhaft. Eine Sprache wird nicht turingmächtig weil ich mir das so arg wünsche.