NULL
-
Scala kenne ich nicht, aber es scheint auf den ersten Blick keine Minimal-Syntax-Sprache zu sein.
Im Gegenteil
Ich finde eher, Syntax schränkt die Ausdrucksfähigkeiten ein, anstatt sie zu erweitern.
Sag ich ja.
Ich würde sagen eine Sprache mit viel Syntaxregeln ist in den von dem von der Syntax abgedecktem Spektrum kürzer und einfacher zu lesen. Allerdings eben nicht so mächtig. Allerdings: desto mehr zusätzliche Syntaxregeln, desto größer das Spektrum.
-
JustAnotherNoob schrieb:
Allerdings: desto mehr zusätzliche Syntaxregeln, desto größer das Spektrum.
nichtsdestotrotz, eine sättigung ist schnell erreicht. es bringt ja nicht viel, wenn du 10 möglichkeiten hat, das gleiche zu tun, aber 8 davon zusätzliche probleme aufwerfen.
-
JustAnotherNoob schrieb:
Ich würde sagen eine Sprache mit viel Syntaxregeln ist in den von dem von der Syntax abgedecktem Spektrum kürzer und einfacher zu lesen.
Minimalsyntax-Sprachen erlauben es aber ihrerseits, 'domain-specific languages' zu implementieren, die man paßgenau an die Notation der zu lösenden Aufgabe anpassen kann. Z.B. sind in Tcl arithmetische Ausdrücke als Untersprache 'expr' definiert, ohne, daß man dazu den Sprachkern von Tcl mit Syntaxregeln für arithmetische Ausdrücke hätte zukleistern müssen. Genial.
Selbst Objektmodelle lassen sich in Tcl implementieren, ohne die Sprache zu verlassen. Klassenbasierte OO ist zu restriktiv? Kein Problem, man kann ein prototypenbasiertes Objektmodell in Tcl implementieren, ohne zusätzliche Syntaxregeln.
-
+fricky schrieb:
wer redet hier von vererbung (ausser dir)?
Interfaces sind Mehrfachvererbung ohne Implementation. Wenigstens soviel sollte man wissen.
-
tfa schrieb:
Ist ja alles richtig, aber als du dann das erste mal was gesehen hast wie 1<<30, was hast du dann gedacht?
1 sehr viel kleiner als 30.
-
DEvent schrieb:
Was passiert wenn es schief geht? Eine Art "Fehler-Matrix" zurueck zugeben? Oder eine exception zu werfen? Eine add() Funktion koennte einfach boolean zurueck geben.
Fehlercodes sind sch***!
Wenn gegen Kontrakte verstoßen wird, wirft man eine Exception. Das it ganz einfach, nur wird das von zu vielen nicht verstanden.
-
~john schrieb:
+fricky schrieb:
wer redet hier von vererbung (ausser dir)?
Interfaces sind Mehrfachvererbung ohne Implementation. Wenigstens soviel sollte man wissen.
mehrfachvererbung ist eigentlich der falsche begriff dafür, obwohl man es hin und wieder mal im zusammenhang mit interfaces liest. mehrfachvererbung ist das: http://en.wikipedia.org/wiki/Diamond_problem
-
u_ser-l schrieb:
In anderen OO-Sprachen wie z.B. smalltalk ist "+" nichts Anderes als eine Nachricht (mit einer zweiten Zahl als Parameter), die an Zahlen gesendet wird: 4 + 5 im Sinne von "4.add(5)"
Ja, das ist einer der bekannten Nachteile von Smalltalk, da es nur einfaches dynamisches Dispatching kennt, und das in diesem Kontext ziemlich schnell sinnlos ist.
Beispiel:
Skalare Multiplikation von Matrizen.
int i = 2;
Matrix A;mul (A, 2); // A2 das geht auch in Smalltalk
mul (2, A); // 2A das nicht mehr 2.mul(A) ergibt da keinen SinnKann in Smalltalk niemals umgesetzt werden, denn die int Klasse versteht die Message nun einmal nicht. In C++ gibt es daher Operator-Funktionen und so kann man leicht die korrekte Funktionalität bereitstellen.
Alternativ kann man natürlich eine Sprache mit "mutiple dispatch" entwerfen, da wird dann dynamisch an Hand aller Parameter die richtige Methode ermittelt.
-
+fricky schrieb:
~john schrieb:
+fricky schrieb:
wer redet hier von vererbung (ausser dir)?
Interfaces sind Mehrfachvererbung ohne Implementation. Wenigstens soviel sollte man wissen.
mehrfachvererbung ist eigentlich der falsche begriff dafür,
Nein, es ist der einzig richtige Begriff!
Mehrfachvererbung heißt erstmal nur, daß eine Klasse von mehreren Klassen abgeleitet ist, Diamonds müssen gar nicht vorkommen. Sprachen mit Interfaces lösen das Problem des Diamonds mittels der Einschränkung, daß jede Interfaces Klasse eine Superklasse sein muß. Dazu kommen üblicherweise noch Einschränkungen, daß die verschiedenen Mutterklassen einer konkreten Klasse niemals die gleichen Methodennamen verwenden dürfen. Aus diesen beiden Gründen braucht man auch kein Mittel Nameskonflikte lösen zu können. C++ hat diese Mittel, aber man braucht sie wirklich sehr selten. Sollte man Mehrfachverbung im Sinne von Interface Klassen benutzen braucht man sie gar nicht.Um es zu konkretisieren:
Interface Klassen sind abstrakte Superklassen ohne Implementation, und beim Ableiten dürfen keine Methodennamenskollisionen auftreten.
-
~john schrieb:
+fricky schrieb:
~john schrieb:
+fricky schrieb:
wer redet hier von vererbung (ausser dir)?
Interfaces sind Mehrfachvererbung ohne Implementation. Wenigstens soviel sollte man wissen.
mehrfachvererbung ist eigentlich der falsche begriff dafür,
Nein, es ist der einzig richtige Begriff!
völlig falsch klingt er, allein schon wegen des 'mehrfach' da drin. ich würde es vielleicht als 'schnittstellenbeerbung' bezeichnen. aber egal...
-
völlig falsch klingt er, allein schon wegen des 'mehrfach' da drin. ich würde es vielleicht als 'schnittstellenbeerbung' bezeichnen. aber egal...
hä?
Schau dir doch einfach an was Interfaces sind.. von der Funktionalität gekürzte Klassen, von denen man unbeschränkt erben kann.
Der letztere Fakt ist Mehrfachvererbung, nur eben ohne die Probleme dieser zuzulassen(du kannst es auch gerne anders nennen, aber durch Nomenklatur ändert sich die Semantik nicht).
Dass du in C++ auch problemlos auf Mehrfachvererbung verzichten kannst oder Klassen wie Interfaces verwenden kannst ignorierst du gekonnt. Genau wie die Tatsache, dass Mehrfachvererbung nicht nur Probleme hervorruft, sondern auch nützlich ist. Du kannst auch nicht sagen, dass die Probleme die Nützlichkeit aufwiegen, weil du es nunmal nur dann verwendest, wenn es auch wirklich nützlich ist.
Auch hier: Du verwendest es nicht aus Versehen, Fehler treten zusätzlich noch zur Compiletime auf => sinnlose Beschränkung.
-
JustAnotherNoob schrieb:
Schau dir doch einfach an was Interfaces sind.. von der Funktionalität gekürzte Klassen...
jein, schau mal hier: http://java.sun.com/docs/books/tutorial/java/concepts/interface.html
http://mindprod.com/jgloss/interfacevsabstract.htmlJustAnotherNoob schrieb:
Dass du in C++ auch problemlos auf Mehrfachvererbung verzichten kannst oder Klassen wie Interfaces verwenden kannst ignorierst du gekonnt.
hab' ich doch gar nicht. in C++ kann man sich die abenteuerlichsten konstrukte bauen. das sowas nicht geht, würde ich niemals anzweifeln. (z.b. diese sache von vorgestern, klassen die mit hilfe der operatorüberladung pointer vorgaukeln können, usw.).
-
+fricky schrieb:
jein, schau mal hier: http://java.sun.com/docs/books/tutorial/java/concepts/interface.html
http://mindprod.com/jgloss/interfacevsabstract.htmlInterfaces sind abstrakte Klassen leicht abgewandelt.
das merkt man zB auch schon daran dass man sehr oft interface + abstrakte Klasse in Java implementieren muss wenn man nur eine Schnittstelle anbieten will.
Weil Interfaces eben einen Bereich abdecken und abstrakte Klassen einen Bereich abdecken und dieser Bereich überschneidet sich größtenteils.
Schauen wir uns dazu mal den einen Link von dir an
When To Use Interfaces
An interface allows somebody to start from scratch to implement your interface or implement your interface in some other code whose original or primary purpose was quite different from your interface. To them, your interface is only incidental, something that have to add on to the their code to be able to use your package.
When To Use Abstract classes
An abstract class, in contrast, provides more structure. It usually defines some default implementations and provides some tools useful for a full implementation. The catch is, code using it must use your class as the base. That may be highly inconvenient if the other programmers wanting to use your package have already developed their own class hierarchy independently. In Java, a class can inherit from only one base class.Ah, eine abstrakte Klasse bietet mehr Struktur? Dass es in Java unpraktisch ist von einer Klasse zu erben ist eben wegen der dummen single inheritance idee notwendig. Aber wenn ich von unendlich vielen Klassen erben kann dann bleibt da nur stehen: "An abstract class, in contrast, provides more structure."
Big deal...
Single Inheritance gibt es übrigens aus einer technischen notwendigkeit: object ist die basisklasse und wenn es mi geben würde, hätte man automatisch deadly diamonds of death. deshalb hat man interfaces als alternative zu abstrakten klassen genommen und sie halt um ein paar passende features erweitert.
dennoch hat man damit lediglich den deadly diamond eliminiert (was natürlich praktishc ist, keine frage) aber alle anderen probleme von mi hat man dennoch.
-
Shade Of Mine schrieb:
deadly diamonds of death
Indiana Shade und der tödliche Diamant des Todes
-
Warum geilen sich alle an dieser dämlichen Vererbung auf? Wofür glaubt ihr, ist die gut? Um Code wiederzuverwerten? Und wenn ich Code aus vielen Klassen wiederverwerten will, nimmt man Mehrfachvererbung? Toller Plan.
In guten OO-Designs findet Vererbung so wenig wie möglich statt, Mehrfachvererbung schon gar nicht. Programmierung gegen Schnittstellen, Komposition und Delegation ist angesagt. Das fördert Kapselung und reduziert Kopplung - im Gegensatz zu Subklassen. Interfaces ist das, was man braucht, und vielleicht 1-2 Vererbungshierarchien für die Implementierungen - wenn überhaupt.Eine anständige OO-Denkweise scheint im C++-Millieu nicht besonders weit verbreitet zu sein.
-
tfa schrieb:
Programmierung gegen Schnittstellen[...] ist angesagt. Das fördert Kapselung und reduziert Kopplung - im Gegensatz zu Subklassen. Interfaces ist das, was man braucht,
Auch wenn du implements statt extends sagst, ist und bleibt es vererbung
Und OOP hat mal überhaupt nix mit Klassen und Interfaces zu tun.
-
Shade Of Mine schrieb:
Auch wenn du implements statt extends sagst, ist und bleibt es vererbung
Nein, ist es nicht
Und OOP hat mal überhaupt nix mit Klassen und Interfaces zu tun.
OO kommt auch gut ohne Klassen und Interfaces aus, richtig. Aber "nix zu tun" ist zu viel gesagt. Die meisten OO-Sprachen unterstützen mindestens Klassen. Viele davon Vererbung. Und die lässt sich wunderbar missbrauchen. Besonders die ach so tolle Mehrfachvererbung.
-
tfa schrieb:
Shade Of Mine schrieb:
Auch wenn du implements statt extends sagst, ist und bleibt es vererbung
Nein, ist es nicht
dh in C++ ist also per definition kein vernünftiges OOP möglich, da du bei interfaces extends statt implements sagst?
OO kommt auch gut ohne Klassen und Interfaces aus, richtig. Aber "nix zu tun" ist zu viel gesagt. Die meisten OO-Sprachen unterstützen mindestens Klassen. Viele davon Vererbung. Und die lässt sich wunderbar missbrauchen.
Wusstest du dass in Sprachen mit einem interface schlüsselwort deutlich tiefere und häßlichere hierachien existieren als in sprachen ohne?
c++ ist zB wunderbar in der hinsicht: alles was sich wie ein T verhält, ist ein T. In Java hast du plötzlich TAble als interface. *brr* (wenn du wissen willst warum *brr* dann schau dir mal UnsupportedOperationException an).
In C++ kann ich über extends genauso dumme hierachien erstellen wie man sie in Java hat - ob implements oder extends verwendet wird ist komplett egal.
Oder kannst du mir den grossen unterschied einer ABC gegenüber einem Interface in einer Sprache mit MI erklären?
(und vielleicht auch noch gleich warum man in Java so oft Interface+ABC habe um eine Schnittstelle zu definieren?)
Kleiner Tipp: es liegt an der technischen notwendigkeit wegen Object als ultimative Basisklasse. Und aus der Not versucht man eine Tugend zu machen. Interfaces sind ja nichts schlechtes - nur sollte man wissen dass ein implements genauso eine Bindung wie ein extends ist. (wobei dank UnsupportedOperationException ist das in Java ja gut umgehbar...)
-
~john schrieb:
Nein, es ist der einzig richtige Begriff!
[...]
Um es zu konkretisieren:
Interface Klassen sind abstrakte Superklassen ohne Implementation, und beim Ableiten dürfen keine Methodennamenskollisionen auftreten.Unfug. Vererbung setzt voraus, daß etwas vererbt wird. Interfaces implementiert man lediglich. Daß Methodennamen nicht kollidieren dürfen, ist dabei ein Artefakt der Sprache C++; in Delphi ist das beispielsweise kein Problem.
-
jein, schau mal hier: http://java.sun.com/docs/books/tutorial/java/concepts/interface.html
Features: Multiple Inheritance
Danke dass du dir selbst widersprichst, dann muss ich das nicht mehr tun.Ach ja: Wenn es Vererbung ist von einer abstrakten Klasse mit ausschließlich abstrakten Methoden zu erben, dann ist es das auch bei Interfaces.
Dass nur das Subtyping stattfindet kann man so oder so auslegen, macht aber keinen Unterschied für den Inhalt der Diskussion.