Hallo zusammen :)
Direkt vorweg, ich suche nicht nach einem "Was ist die bessere Sprache,
Java vs. HTML5" sondern viel mehr, welche Sprache es sich lohnt, für
meine aktuellen Bedürfnisse zu lernen.
Daher kurz zu meinem Backround.
Ich bin Elektrotechnik-Ingenieur und befasse mich beruflich und auch
privat mit der Entwicklung von eingebetteten Systemen und der
hardwarenahen Programmierung. Hierfür nutze ich entsprechend C als
Sprache der Wahl.
Da ich privat beginne meine entworfenen Lichtansteuerungen und Sensoren
über Funk (Bluetooth/WLAN) vernetzen zu wollen (Stichwort Home
Automation), dachte ich mir dass es sinnvoll wäre eine zweite
Programmiersprache zu lernen.
Was ich machen möchte lässt sich leicht erklären:
Ich möchte in der Lage sein, Desktop oder ggf. auch Smartphone
Applikationen zu schreiben, um mit meinen Schaltungen über die
verfügbaren Funk- oder Hardwareschnittstellen wie bspw. USB beim PC,
kommunizieren und Einstellungen vornehmen zu können.
Eine Idee wäre hier bspw. verschiedene Beleuchtungen über eine
Desktop-App zu gruppieren und einstellen zu können. Das ganze dann über
die WLAN-Verbindung oder über eine, per USB an den PC angeschlossene,
Hauptstation.
Zusätzlich wäre es für mich noch praktisch, wenn ich es auch beruflich
eventuell einbringen könnte, indem man (Web-) Applikationen schreibt um
bspw. Tests oder Betriebsmittel verwalten zu können oder Oberflächen für
Testautomatisierungen zu programmieren welche als Basis auf einem
Mikrocontroller laufen.
Nach einer kurzen Recherche bin ich dabei auch schnell zu Java tendiert,
da man hiermit, meines Wissens nach, alle diese Funktionalitäten
erfüllen kann. Besonders da Java auch recht plattformunabhängig ist.
Doch erinnerte ich mich, dass mir ein Kollege mal erzählte, dass man mit
HTML5 in Kombination mit CSS und Javascript (HCJ ab jetzt genannt) auch
viele Applikationen in diese Richtung programmieren könnte.
Da HTML und CSS für mich bis dahin nur Beschreibungssprachen für
Websites waren, hab ich eine tiefere Recherche durchgeführt, welche mich
mit mehr Fragen hinterlässt als mir beantwortet wurden.
Nach meiner Recherche ist es nämlich angeblich möglich Desktop-/
Smartphone und auch Web-Apps, welche den oben genannten Umfang erfüllen
sollen, auch mittels HCJ zu entwickeln.
Besonders attraktiv für mich kam mir die Möglichkeit, alle Applikationen
als Web-App zu designen über welche man spielend von verschiedenen
Systemen drauf zugreifen könnte und und diese ggf. über Wrapper an
Native Systeme zu binden, vor.
Zumindest wie ich es verstanden hatte, würde dies alle Funktionalitäten
abdecken welche für mich von Interesse sind. So könnte eine Web-App
entwickelt werden welche vom PC ausgeführt wird und über USB/WLAN mit
den verschiedenen entwickelten Aktoren kommuniziert oder eine
Smartphone-App, sei es über den Browser oder mittels Wrapper als
eigenständige App, mit welcher man automatisierte Tests verwalten kann
indem Daten empfangen und abgelegt werden.
Das Problem dabei ist, dass ich nicht wirklich herausfinden konnte in
welchem Umfang dies alles möglich ist, weswegen ich gerne hier nach
Meinungen fragen möchte, ob Java oder HCJ die bessere Wahl für mich ist?
Als Versuch dies herauszufinden habe ich, da ich mich auch für neuronale
Netzte und Deep Learning interessiere, gesucht, ob dies über HCJ möglich
wäre. Auch hier wurde ich fündig, dass Deep Learning über HCJ-Apps und
passenden Libraries gar kein Problem wäre...
Meine Freizeit ist leider etwas begrenzt weswegen ich nicht die
zeitlichen Ressourcen habe mich in 2 Sprachen einzuarbeiten.
Meine Fragen daher:
1. Welche Sprache ist für meine Anforderungen wohl besser geeignet?
2. Kann man über HCJ wirklich auch komplexe Programme mit etwas
tiefgehenderen Algorithmen für bspw. neuronale Netzte entwickeln?
Ich entschuldige mich für den langen Post, hoffe auf ein paar
konstruktive Beiträge und freue mich auf eure Antworten.
Viele Grüße
Ein Gast :)
Für dich wäre für eine Webapp HTML5 und Javascript interessant. Falls du
das ganze noch Stylen willst kannst du auch gerne noch zu CSS
greifen.Alle Sprachen sind nicht so schwer und es gibt auch jede menge
Artikel im Internet darüber.
Hallo und danke für die Antwort :)
Wäre es mit diesen Tools denn auch möglich Desktop-Apps und eventuell
auch ein umfangreicheres Programm für neuronale Netzte, Deep Learining,
oder Messdatenverarbeitung zu schreiben?
Ich möchte ja eine Applikation schreiben welche nicht nur geschlossen im
Web agiert sondern mit welcher ich auch Sensoren und
Mikrocontrollerschaltungen ansteuern kann (Funkkommunikation oder bspw.
seriell über USB ComPort).
Viele Grüße
Ein Gast
Lerne erstmal programmieren. z.B. mit dem vorgeschlagenen Javascript.
Wenn du programmieren kannst, ist der Wechsel von einer zu einer anderen
Programmiersprache einfach.
Und ja, mit Javascript+HTML kann man Desktop und Händie-Apps erstellen
(-> Electron, cordova, ...)
Man kann neuronale Netze trainieren (deeplearn.js/tensorflow.js)
Man kann IOT-Sachen ansteuern (über MQTT, Websocket, XHR, ...)
Man kann sogar µC damit programmieren (https://www.espruino.com/)
HTML, CSS, Javascript, usw sind Websprachen, optimiert zur Darstellung.
Die grad genannten sind nicht entweder-oder, sondern zwingend UND. Es
gibt allerdings auch Erweiterungen, im Sinne von Libraries, die eine
Kommunikation mit einem Serialport erlauben. Dazu muesste man zu den
Libraries noch AJAX koennen. Dieses Alles wuerd ich mir aber nicht aufs
Mal antun wollen.
Dann besser die Webseite grad auf dem Controller generieren. Obwohl,
dann ist man ja auch wieder bei den Websprachen.
Ein Programmablauf einer Websprache ist allerdings sehr verschieden zu
einem Programmablauf auf einem PC oder sonstigen computer.
Εrnst B. schrieb:> Wenn du programmieren kannst, ist der Wechsel von einer zu einer anderen> Programmiersprache einfach.>> Und ja, mit Javascript+HTML kann man Desktop und Händie-Apps erstellen> (-> Electron, cordova, ...)
Hallo und Danke für die Antworten :)
Also würdet ihr mir im allgemeinen schon raten die genannte Kombination
aus HTML, CSS, Javascript und ggf. Ajax zu lernen, anstatt mich mit der
Java-Programmierung auseinander zu setzen?
Das der Ablauf verschieden zu dem Programmablauf auf dem PC ist, wäre
für mich vorerst kein Hindernis. Da ich so oder so eine neue
"Programmier-Denkweise" lernen müsste. Bei Java halt die
Objektorientierung und bei HTML & co. den Web-Aspekt.
Bin weiterhin dankbar für Antworten :)
VG
Ein Gast
HTML/CSS sind keine Programmiersprachen, sie dienen zur Beschreibung
einer Seite zur Anzeige im Browser.
Ansonsten: C. Ich wühle mich gerade in C++ rein und fühle mich wie
in den Mühlen der deutschen Bürokratie ...
Aus meiner Erfahrung würde ich dir zu einem Webinterface als Oberfläche
raten. Es läuft in allen Browsern und damit z.B. auch einfach auf einem
Tablet. Du kannst es problemlos über LAN/WLAN verteilen und über VPN
sogar übers Netz. Die Protokolle sind schon da, es ist also einfacher,
als selbst etwas auf TCP/IP auszubauen.
Damit bist du automatisch bei HCJ.
Jetzt braucht man noch eine Gegenstelle, die die statischen Dateien der
Webseite ausliefert und eine dynamische Schnittstelle für die
Steuerbefehle/Abfragen bietet. Diese würden dann auf deinem
Steuerrechner als Server laufen. Hier kann man im Prinzip jede Sprache
verwenden, aber auch hier kann man JavaScript verwenden (node.js) und
muss damit nicht noch eine weitere Sprache lernen. Ernst hatte ja hier
eine paar Bibliotheken genannt.
Selbst wenn du direkt am Steuerrechner arbeiten willst, kannst du auch
dort einfach mit dem Browser auf localhost zugreifen.
Nachdem du ja in C Programmieren kannst, würde ich an deiner Stelle mal
ein JavaScript Tutorial machen. Von der Logik sind die Sprachen gar
nicht so unterschiedlich, aber in JavaScript macht man es doch meistens
etwas anders. Außerdem kommt dann noch die Verknüpfung mit dem HTML
Dokument Baum dazu.
Kleine Testprojekte kann du auch immer lokal im Browser machen, die
haben in den Entwicklertools auch mittlerweile gute Debugger für
JavaScript.
Erst wenn du dich dort gut eingearbeitet hast, dann würde ich mich um
den Serverteil mit JavaScript kümmern.
Für mein bisher einziges ernsthaftes Projekt habe ich das express
Framework für den Server und React für das Frontend zusammen mit npm
benutzt. Man kann das auch alles selbst machen, aber mittlerweile würde
ich dort immer ein Framework einsetzen, außer das Projekt soll
garantiert nie fertig werden (macht ja auch Spaß :-) ).
Ich würde dir auf jeden Fall raten, ein Buch aus der
Von-Kopf-Bis-Fuß-Reihe zu lesen. Es gibt sowohl für JavaScript, HTML und
CSS, HTML5 sowie Java ein Buch aus der Reihe.
Solltest du dich für Java entscheiden würde ich dir auch dringend
Entwurfsmuster von Kopf bis Fuß dazu empfehlen.
Ein Gast schrieb:> Ich bin Elektrotechnik-Ingenieur und befasse mich beruflich und auch> privat mit der Entwicklung von eingebetteten Systemen und der> hardwarenahen Programmierung. Hierfür nutze ich entsprechend C als> Sprache der Wahl.>> Da ich privat beginne meine entworfenen Lichtansteuerungen und Sensoren> über Funk (Bluetooth/WLAN) vernetzen zu wollen (Stichwort Home> Automation), dachte ich mir dass es sinnvoll wäre eine zweite> Programmiersprache zu lernen.
Auf dem Gerät, das die Hardware anspricht, würde ich bei C bleiben.
Für die Bedienung ist allerdings ein Webinterface ideal. Damit eignet
sich dann jedes Gerät mit Browser( also PC, Tablet oder Smartphone) als
Kontroll- und Bedienelement.
Ich würde dir also empfehlen, dich mit HTML, CSS und Javascript zu
beschäftigen. Mit C kannst du dann Programme schreiben, die diese
Dateien generieren und die Eingaben auswerten. So etwas mache ich gerade
für eine Messwerterfassung und Steuerung auf einem "headless" Raspi.
Vielleicht ist auch das für dich interessant :
https://www.b4x.com/b4j.html
Läuft zwar auch auf JAVA raus, man hat aber viele
Libraries (Serial, Bluethooth, usw.) schon dabei.
Als Ausbilder von (angehenden) Ingenieuren stellen wir uns fast jedes
Semester erneut die Frage, was wir den Studenten aufgrund neuer
Entwicklungen als "wichtige" Technik beibringen sollen. Dabei nimmt oft
die Verunsicherung mit der Tiefe der Recherche zu, denn die Marktmacht
großer Konzerne (Google, Amazon, etc.) setzt Trends und sie stellen
entsprechende Möglichkeiten zur Teilnahme bereit. Hier können/dürfen wir
allerdings nicht kritiklos solchen Trends folgen.
Die Sprache C wird an der Hochschule Hannover (Elektro- und
Informationstechnik) bereits im ersten Semester gelehrt. Für das 5./6.
Semester bieten wir in der Vertiefungsrichtumg "Elektronik" Labore zur
Anwendung von Mikrocontrollern an, die sich zum großen Teil an der
Arduino-Umgebung orientieren und damit auf C/C++ aufsetzen. Es wird
allerdings nicht verlangt, C++ zu beherrschen, sondern die Möglichkeiten
der GNU-Compiler (IDE ist Eclipse) zu nutzen, mit C anzufangen und
schrittweise (bei Bedarf) auf C++ zu erweitern. Da fängt man zunächst
mit einfachen Klassen an und lernt in kleinen Schritten (learning by
doing) dazu.
Gelehrt wird ebenfalls das Zusammenspiel netzwerkfähiger Geräte
(Mikrocontroller mit LAN/WLAN, Smartphones, Tablets, etc.) für sog.
cyber-physische Systeme und das Internet der Dinge, wobei konkrete
Anwendungen auch die Heimautomatisierung betreffen. Hier wird Android
Studio zur Entwicklung von APPs eingesetzt, was im Regelfall die Sprache
Java voraussetzt (Möglichkeiten zur Nutzung von C/C++ für APPs werden
gerade recherchiert). In den entsprechenden Laboren wird allerdings Java
auch nicht vorausgesetzt, sondern es werden von den Studenten lauffähige
Beispielprogramme (identische Anwendungen in C/C++ für MC und in Java
für APPs zum Vergleich) für eigene Anwendungen erweitert.
Man muss hier einfach den Umstand berücksichtigen, dass zum Verstehen
und Anwenden der vielfältigen (grafischen) Objekte aus der
Android-Umgebung ein deutlich höherer Aufwand erforderlich ist, als zum
Erlernen der Sprache Java selbst.
So gesehen kommen unsere Absolventen (Elektronik) also bez. der
Programmiersprachen mit den Schwerpunkten C/C++ und Java ins
Berufsleben.
Für typische Web-Server stehen ihnen bei den Laboren entsprechende
Bibliotheken in den beiden Sprachen zur Verfügung. In diesem Rahmen
kommen sie auch mit PHP in Berührung, basierend auf den Umgebungen LAMP
(Linux) und XAMPP (Windows).
Damit stellen wir gewissermaßen die Grundlagen zur Verfügung, um bei dem
Megatrend "Digitalisierung" mit ausreichend Know-how eigene Konzepte
entwickeln zu können und nicht von irgendwelchen Trends abhängig zu
sein.
Für die praktische Anwendung ist es wichtig, einige grundlegende
Randbedingungen festzulegen, "bevor" man sich für eine Technologie
entscheidet. Weil man sonst oft gar nicht mehr zurück kann und viele
Kröten schlucken muss, die sich erst später offenbaren.
Dazu ein paar Hinweise (für Ingenieure, die selbst Geräte
programmieren):
- Soll meine Anwendung vom Internet abhängig sein oder auch ohne
funktionieren?
- Will ich von Herstellern unabhängig sein?
- Soll die Anlage dezentral arbeiten (ohne Basis-Station)?
- Sollen meine Geräte auch autark arbeiten (Grundfunktionalität)?
- Will ich nur eine Fernsteuerung von Geräten oder mehr (intelligente
Geräte)?
- etc.
Wenn man also erst das Konzept seiner Anlage (z.B. Heimautomatisierung)
und die zugehörigen Randbedingungen definiert und dann nach den
technischen Möglichkeiten recherchiert, ist das Tohuwabohu um die
Technologien schnell eingegrenzt.
Jobst Q. schrieb:> Auf dem Gerät, das die Hardware anspricht, würde ich bei C bleiben.
Das würde ich pauschal nicht so sehen.
Handelt es sich dabei um einen Bare-Metal Controller, dann ja.
Sobald es aber eine besserer Rechner (z.B. Raspberry Pi) ist, würde ich
eine höhere Sprache verwenden (Python, JavaScript, Java). Nach meiner
Erfahrung kommt man damit schneller zum Ergebnis, weil man sich seine
Logik aus verschiedenen Bibliotheken zusammenbauen kann und damit
schneller zum Ziel kommt.
Der Umstieg dahin ist allerdings erstmal anstregend. Ich fand zum
Beispiel Python am Anfang schwierig, weil das ganze nicht so richtig mit
den mir aus C bekannten Konzepten zusammenpasste.
M.K. B. schrieb:> Jobst Q. schrieb:>> Auf dem Gerät, das die Hardware anspricht, würde ich bei C bleiben.>> Das würde ich pauschal nicht so sehen.>> Handelt es sich dabei um einen Bare-Metal Controller, dann ja.> Sobald es aber eine besserer Rechner (z.B. Raspberry Pi) ist, würde ich> eine höhere Sprache verwenden (Python, JavaScript, Java).
Das war auch nicht pauschal gemeint, sondern als Rat für den
Fragesteller, bei dem ich davon ausgehe, dass er C beherrscht, andere
Sprachen aber noch nicht.
Es geht um den Lernaufwand und den Bezug zum Nutzen. Ein Webinterface
mit HTML,CSS und Javascript ist auf jeden Fall vielseitiger,unabhängiger
und zukunftssicherer als spezielle APPs, die man mit Java erstellen
könnte.
Solche Dateien mit C zu erzeugen, hat keine solche Komplexität, dass
Java oder Python große Vorteile bringen würden. Im wesentlichen ist es
eine Aneinanderreihung von fprintf-Aufrufen.
Hallo zusammen und erneut vielen Dank für die vielen und ausführlichen
Antworten :)
Kurz zu dem Punkt mit der Programmiersprache für die Hardware:
Hier möchte ich eigentlich auf jedenfall bei C bleiben. Da ich besonder
überwiegend mit den "Bare-Metal"-Controllern arbeite bietet sich C
einfach ideal an :)
@Robert Patzke
So ähnlich sah mein Grundlagenstudium auch aus, nur dass nach der
C-Programmierung und der Mikrocontroller der Fokus mehr in Richtung
Hardware und nicht auf die möglichen Kommunikationsmöglichkeiten gelegt
wurde. Demnach kam ich auch nicht mit den objektorientierten
Programmiersprachen in Berührung.
Daher soll die 2. Sprache/Sprachen mir lediglich die Möglichkeit geben
auch mal eigenständige Software-Applikationen bspw. für Neuronale Netzte
zu schreiben, oder halt Programme und Interfaces mit welchen ich über
die zahlreichen Schnittstellen mit den Controllern kommunizieren kann.
Als grobes Beispiel vielleicht ein STM Mikrocontroller welcher
verschiedene Sensoren ausliest und LEDs ansteuern kann. Dieser wird
mittels eines ESP-Boards in ein WLAN Netzwerk oder mittels eines
seriellen USB ComPorts mit dem Desktop-PC verbunden auf welchem wiederum
ein Programm läuft womit man verschiedene Parameter ändern, Werte
auslesen/einspeisen kann oder Funktionsgruppen festlegen welche dann
alle eingefügten Sensormodule ansprechen.
Nach den bisherigen Beiträgen würde ich aktuell zu der
HTML/CSS/JavaScript-Lösung tendieren da ich dort am flexibelsten
aufgestellt zu sein schein.
Ich werd mir, wie von euch vorgeschlagen, in meiner freien Woche mal ein
JavaScript und HTML Tutorial zu Gemüte führen.
Jetzt aber noch 2. Abschlussfragen:
1. Es hört sich so an als ob man alles was man aktuell in Java
programmiert auch mit den entsprechenden HTML/CSS/JavaScript Frameworks
realisieren könnte. Wo genau läge da dann noch der Vorteil Java zu
lernen?
2. Welche Variante schätzt ihr mit mehr Gesamtaufwand ein bis man erste
Prototypen und funktionsfähige Programme mittleren bis kleinen Umfangs
realisieren kann? In Anbetracht der bereits bekannten
Programmierkenntnisse in C.
Ich bedanke mich vorab und wünsche noch ein schönes Wochenende.
VG
Ein Gast
Ein Gast schrieb:> Ich werd mir, wie von euch vorgeschlagen, in meiner freien Woche mal ein> JavaScript und HTML Tutorial zu Gemüte führen.
Dann schau dir in dem Atemzug auch gleich das Trio
Typescript/NodeJS/AngularJS an.
Hat den Vorteil dass du sowohl am Server als auch am Client die gleiche
Sprache hast.
> Jetzt aber noch 2. Abschlussfragen:> 1. Es hört sich so an als ob man alles was man aktuell in Java> programmiert auch mit den entsprechenden HTML/CSS/JavaScript Frameworks> realisieren könnte. Wo genau läge da dann noch der Vorteil Java zu> lernen?
Von C kommend? keiner ;)
Auch bei Java kommst du um das HTML/CSS-Gespann nicht herum. Bleibt also
nur Java versus Javascript/Typescript in den Überlegungen übrig.
> 2. Welche Variante schätzt ihr mit mehr Gesamtaufwand ein bis man erste> Prototypen und funktionsfähige Programme mittleren bis kleinen Umfangs> realisieren kann? In Anbetracht der bereits bekannten> Programmierkenntnisse in C.
Aus eigener Erfahrung ist der Umstieg auf Java deutlich heftiger zu
bewältigen.
Andi schrieb:> Von C kommend? keiner ;)
Oh je, oh je...
Also ich fluche jedes Mal wenn ich in C was machen muß und wieder in
diese beschissene prozedurale Denke rein muß. Objektorientiert
programmiert es sich doch deutlich angenehmer.
Wühlhase schrieb:> Andi schrieb:>> Von C kommend? keiner ;)> Oh je, oh je...>> Also ich fluche jedes Mal wenn ich in C was machen muß und wieder in> diese beschissene prozedurale Denke rein muß. Objektorientiert> programmiert es sich doch deutlich angenehmer.
Auch in C kann man objektorientiert arbeiten. Es erfordert zwar
wesentlich mehr Disziplin und einige Klimmzüge, aber es geht.
Tatsächlich gilt, was in der OOP als Datenkapselung bezeichnet wird,
auch in C als guter Stil.
Wühlhase schrieb:> Das würde ich ja gerne mal sehen.
Dann schau Dir einfach GTK+ an.
> OOP besteht auch, aber nicht nur, aus Datenkapselung.
"OOP to me means only messaging, local retention and protection and
hiding of state-process, and extreme LateBinding of all things." (Dr.
Alan Kay)
Geht alles auch in C. Mal mehr, mal weniger aufwändig, und bei Weitem
nicht so komfortabel wie in C++ und anderen Sprachen, die OOP direkt mit
eigenen Sprachmitteln unterstützen, aber: es geht.
~Mercedes~ schrieb:> Karl Käfer wurde nicht gefragt... :-)>> Wen es interessiert:>> C im 21. Jahrhundert, O'reilly, von Ben Klemens> ISBN 978-3-95561-692-2
Hab' die englischsprachige Version, sehr empfehlenswert. Das beschäftigt
sich aber eher mit der Entwicklungsinfrastruktur und Werkzeugen und ist
daher eher was für Leute die C schon können.
Hallo,
ich kann folgende Kombination wirklich empfehlen: C am Mikrocontroller,
der Rest (nicht REST) mit JavaScript, HTML und CSS.
Dabei kann man mit node.js PC Anwendungen und Server mit JavaScript
schreiben (auch mit Hardwareanbindung für fast alles, siehe npm).
Client (Browser) seitig dann auch JavaScript, HTML und CSS.
Ich habe vor ca. 2 Monaten vue.js und das quasarFramework gefunden. In
Kombination kann man so extrem schnell professionelle
Benutzeroberflächen erstellen. Wobei hier vue.js wirklich der Schlüssel
zum Erfolg ist.
Natürlich sollte man sich auch mit AJAX, HTTP Requests, Proxies usw.
auch beschäftigen.
Lg.
Karl Käfer schrieb:> "OOP to me means only messaging, local retention and protection and> hiding of state-process, and extreme LateBinding of all things." (Dr.> Alan Kay)>> Geht alles auch in C. Mal mehr, mal weniger aufwändig, und bei Weitem> nicht so komfortabel wie in C++ und anderen Sprachen, die OOP direkt mit> eigenen Sprachmitteln unterstützen, aber: es geht.
Und was ist mit Vererbung? C kriegt die Beziehung "... ist eine Art von
..." schlicht nicht hin, gerade damit werden viele Kniffe aber erst
möglich (siehe Dekoratormuster).
Klar kann man in C etwas formulieren dessen Kompilat dem eines richtigen
C++-Programms ähnelt, mit objektorientierter Programmieren hat das
meines Erachtens aber nichts zu tun.
Wühlhase schrieb:> Klar kann man in C etwas formulieren dessen Kompilat dem eines richtigen> C++-Programms ähnelt, mit objektorientierter Programmieren hat das> meines Erachtens aber nichts zu tun.
Muß es das ?
Ich lerne gerade C++, struct nennt sich halt jetzt Klasse.
Ich schmeiß den Kram noch an die Wand ... ;(
Abradolf L. schrieb:> Joachim D. schrieb:>> Ich lerne gerade C++, struct nennt sich halt jetzt Klasse.>> Nein. Es gibt durchaus einen Unterschied zwischen struct und class
Klar ... ;)
Ich möchte ergänzen, dass Java (konkret OpenJDK und Oracle JDK) keine
Funktionen zum Zugriff auf Hardware hat. Es gibt nur Bildschirm,
Tastatur, Netzwerk und Filesystem.
Für alles Weitere, insbesondere serielle Ports, benötigt man zusätzliche
Libraries die in C (!) geschrieben sind. Zum Beispiel RxTx
(http://rxtx.qbang.org/wiki/index.php/Download).
Gleiches Gilt übrigens soweit ich weiß auch für Python, nur dass dort
schon die Unterstützung einiger Hardware Schnittstellen im Lieferumfang
enthalten sind. Bei Java ist das leider nicht der Fall.
Anders sieht es allerdings bei Android aus. Das Android SDK enthält Java
Klassen für so ziemlich jede Funktion und Schnittstelle, die von Android
Geräten bereit gestellt wird.
Abradolf L. schrieb:> Joachim D. schrieb:>> Klar ... ;)>> Doch, Stichwort Default Sichtbarkeit.
Ok, aber wozu ?
Ich habe mal mit Maschinencode/Assembler angefangen und bin
irgendwann bei C gelandet. Über teutsche Verwaltungsgläubigkeit
habe ich mich schon immer aufgeregt - jetzt C++. Oha !
Der Rechner soll das machen was ich will und der Compiler das
so übersetzen daß die Maschine es versteht. Da brauche ich
eigentlich keine 7 Durchschläge.
Ich habe jetzt 2 Tage damit verplempert damit mir G++ eine
SQLite Datenbank überhaupt mal anlegt, "Callback" hurra.
In C einfach, in C++ mache ich es auch so wie in C. Globale
Veriable damit ich im callback drankomme. Überall im WWW wird
von callback abgeraten und es werden teilweise wildeste
Konstruktionen als Ersatz dafür propagiert. Echt ein Fortschritt.
Grüße Joe.
PS: Ich bekomme das schon irgendwie hin ;)
Wühlhase schrieb:> Karl Käfer schrieb:>> "OOP to me means only messaging, local retention and protection and>> hiding of state-process, and extreme LateBinding of all things." (Dr.>> Alan Kay)>>>> Geht alles auch in C. Mal mehr, mal weniger aufwändig, und bei Weitem>> nicht so komfortabel wie in C++ und anderen Sprachen, die OOP direkt mit>> eigenen Sprachmitteln unterstützen, aber: es geht.>> Und was ist mit Vererbung?
Das ist ein Feature vieler Implementierungen von OO, aber nach Dr. Alan
Kay eben kein Kernbestandteil derselben. Auch Kristen Nygaard, der
Schöpfer der ersten objektorientierten Programmiersprachen Simula 1 und
Simula-67, bestand zeitlebens darauf "that some OOP could be done
without inheritance". Nachdem die beiden die Väter dessen sind, was wir
heute "objektorientiert" nennen -- der Eine der Technik, der Andere des
Namens -- sind das IHMO die ultimativen Referenzen zu dieser Frage. ;-)
Andererseits ist so etwas wie Vererbung durchaus auch in C möglich,
wenngleich... naja, urteile selbst [1]. ;-)
[1]
https://www.codeproject.com/Articles/108830/Inheritance-and-Polymorphism-in-C
Stefanus F. schrieb:> Ich möchte ergänzen, dass Java (konkret OpenJDK und Oracle JDK) keine> Funktionen zum Zugriff auf Hardware hat. Es gibt nur Bildschirm,> Tastatur, Netzwerk und Filesystem.>> Für alles Weitere, insbesondere serielle Ports, benötigt man zusätzliche> Libraries die in C (!) geschrieben sind. Zum Beispiel RxTx> (http://rxtx.qbang.org/wiki/index.php/Download).>> Gleiches Gilt übrigens soweit ich weiß auch für Python, nur dass dort> schon die Unterstützung einiger Hardware Schnittstellen im Lieferumfang> enthalten sind. Bei Java ist das leider nicht der Fall.>> Anders sieht es allerdings bei Android aus. Das Android SDK enthält Java> Klassen für so ziemlich jede Funktion und Schnittstelle, die von Android> Geräten bereit gestellt wird.
Entschuldige bitte, aber die Standardinterpreter von Python und Java
sind selbst in C bzw. C++ geschrieben -- und nutzen ausgiebig das
Konzept der Shared Objects (*.so) oder Dynamic Link Libraries (*.dll):
Insofern verstehe ich ehrlich gesagt nicht, was Dein Punkt ist. Tatsache
ist: das Java Native Interface (JNI) und die C-Schnittstellen von Python
existieren und werden nicht nur für Hardwarezugriffe vielfältig genutzt.
Tatsache ist auch, daß der Code egal ob in Java oder in Python irgendwie
nativ auf der CPU ausgeführt werden muß, und solange es keine Java- oder
Python-Implementierung in Hardware gibt, sind die Interpreter nun einmal
darauf angewiesen, daß der native Code irgendwoher kommt -- der fällt ja
leider nicht vom Himmel.
Joachim D. schrieb:> Ich habe jetzt 2 Tage damit verplempert damit mir G++ eine> SQLite Datenbank überhaupt mal anlegt, "Callback" hurra.
Entschuldige, aber glaubst Du wirklich, daß das der Richtige Weg (tm)
ist, eine neue Programmiersprache mit einem neuen Paradigma zu lernen?
Tut mir leid, aber wenn Datenbankprogrammierung das Erste ist, was Du in
C++ machst, wundert es mich kein bisschen, wenn das frustrierend ist.
Dies nicht zuletzt auch, weil SqLite meines Wissens gar keine C++-API
hat und stattdessen auch für C++ die vorhandene C-API empfiehlt.
Ich will ein Programm schreiben das funktioniert. C++
ist da ein sehr steiniger Weg ...
Heraus kommt eh Maschinencode, egal wie. Brauch ich dazu
unbedingt ein "Paradigma" ?
Ich bekomme das schon noch raus. C lernt man auch nicht
in einem Tag ;)
Wer in Java auf dem PC hardware nah programmieren möchte muss sich eher
früher als später mit C und dem JNI beschäftigen. Deswegen ist es keine
Zeitverschwendung, mit C anzufamgen.
Joachim D. schrieb:> Ich will ein Programm schreiben das funktioniert. C++> ist da ein sehr steiniger Weg ...
Nein, überhaupt nicht. Man muß es nur erst einmal lernen.
> Heraus kommt eh Maschinencode, egal wie. Brauch ich dazu> unbedingt ein "Paradigma" ?
Ja, unbedingt. Dieses andere Paradigma ist der Schlüssel zur OOP.
> Ich bekomme das schon noch raus. C lernt man auch nicht> in einem Tag ;)
Richtig -- und auch in C fängt man üblicherweise erst einmal an mit
einem "Hello World!\n" und tastet sich dann weiter voran. Wer sich als
erstes Programm in C gleich einen Datenbank-Client vornimmt, wird eine
ähnliche Frustration erleben wie Du; bei manchen mündet diese
Frustration sogar in eine grundsätzliche Abneigung gegen die Sprache.
Dabei hat das gar nichts mit der Sprache zu tun, sondern nur mit einer
Herangehensweise, die in zu kurzer Zeit zu viel erreichen will.
Kurz gesagt, überforderst Du Dich selbst. Das kann und wird auf die eine
oder andere Weise schief gehen: entweder gibst Du früher oder später
auf, oder Du wirst die Sprache nicht richtig lernen und darum niemals
richtig sicher, flüssig, produktiv und glücklich damit.
Nix für ungut, nur so ein Tipp.
Sheeva P. schrieb:> Kurz gesagt, überforderst Du Dich selbst. Das kann und wird auf die eine> oder andere Weise schief gehen: entweder gibst Du früher oder später> auf, oder Du wirst die Sprache nicht richtig lernen und darum niemals> richtig sicher, flüssig, produktiv und glücklich damit.
Nein. Das wird funktionieren, es wird ein Mailproxy.
Das meiste funktioniert schon.
Joachim D. schrieb:> In C einfach, in C++ mache ich es auch so wie in C. Globale> Veriable damit ich im callback drankomme. Überall im WWW wird> von callback abgeraten und es werden teilweise wildeste> Konstruktionen als Ersatz dafür propagiert. Echt ein Fortschritt.
Ich kann verstehen, dass man mit der Einstellung von C in anderen
Sprachen aneckt. Meiner Meinung nach fehlt dann aber die Bereitschaft
oder auch Zeit sich mit dem Ansatz der anderen Sprache vertraut zu
machen.
Zugegeben ist es am Anfang frustrierend, aber ich fand es am Ende echt
interessant, wenn man feststellt, dass man ein Problem je nach Sprache
anders und damit leichter oder schwieriger lösen kann.
Für mich war z.B. am Anfang Python exotisch und sobald man versucht
etwas wie in C zu machen wird es kompliziert. Hat man aber die
Grundideen der Sprache besser verstanden, dann geht es ohne Probleme und
manchmal sogar einfacher.
Dein Beispiel würde ich dann sogar als Vorteil vom C -> C++ Umstieg
sehen. Man kann Sachen erst mal so machen, wie man es von C gewöhnt ist
und nach und nach neue Sachen in C++ ausprobieren und den alten C Code
weiter nutzen.
Stefanus F. schrieb:> Wer in Java auf dem PC hardware nah programmieren möchte muss sich eher> früher als später mit C und dem JNI beschäftigen. Deswegen ist es keine> Zeitverschwendung, mit C anzufamgen.
Jetzt geht es nur noch um Java, früher auch um Python. Ok, Python hat in
der Boost-Sammlung natürlich Boost.Python, mit dem man C++-Binaries
einfach in Python einbinden kann -- während Javas JNI zwar primär auf C
zielt, aber auch mit C++ bedient werden kann.
Ich wiederhole mich nicht gerne, aber: Was ist Dein Punkt?
Joachim D. schrieb:> Sheeva P. schrieb:>> Kurz gesagt, überforderst Du Dich selbst. Das kann und wird auf die eine>> oder andere Weise schief gehen: entweder gibst Du früher oder später>> auf, oder Du wirst die Sprache nicht richtig lernen und darum niemals>> richtig sicher, flüssig, produktiv und glücklich damit.>> Nein. Das wird funktionieren, es wird ein Mailproxy.> Das meiste funktioniert schon.
Wenn ich keine Ohren hätte, würde ich jetzt rundum grinsen. ;-)
Sorry, aber: daß Du einen C++-Compiler benutzt, bedeutet leider nicht,
daß Du tatsächlich auch OO-Code in C++ schreibst.
Das war übrigens in den Anfangszeiten von C++ ein besonders "Problem":
die alten C-Entwickler haben im Prinzip immer noch in C entwickelt, und
das war dann aus deren Sicht C++-Code, weil sie zum Übersetzen einen
C++-Compiler benutzt haben.
Joachim D. schrieb:> Ich habe jetzt 2 Tage damit verplempert damit mir G++ eine> SQLite Datenbank überhaupt mal anlegt, "Callback" hurra.
Der g++ legt die Datenbank genauso wenig an wie der gcc. Vielleicht hast
Du neben OO in C++ auch das Compilationsmodell nicht verstanden?
> Nein. Das wird funktionieren, es wird ein Mailproxy.> Das meiste funktioniert schon.
Das sollte ein Witz sein, oder?
Ich glaube, die Ironie in diesem Beitrag war nicht deutlich genug
erkennbar. Außerdem wirkt es so, als ob du der TO (Ein Gast) wärst.
@Sheeva:
Interessant. Ich will mir keinesfalls anmaßen den Vätern der OOP ihre
Kompetenz absprechen. Allerdings frag ich mich doch, wie die beiden zu
ihrer Einstellung kommen? Denn wie gesagt-ohne Vererbung würde vom Werk
der GoF nicht viel übrig bleiben, aber die Möglichkeit solche Konzepte
fahren zu können macht OOP doch zumindest zu einem beachtlichen Teil
aus. Zumindest bei heutigen Anwendungen.
Joachim D. schrieb:> Wühlhase schrieb:>> Klar kann man in C etwas formulieren dessen Kompilat dem eines richtigen>> C++-Programms ähnelt, mit objektorientierter Programmieren hat das>> meines Erachtens aber nichts zu tun.>> Muß es das ?>> Ich lerne gerade C++, struct nennt sich halt jetzt Klasse.
Structs und Klassen sind nicht annähernd dasselbe.
Structs sind einfach nur selbstdefinierte Datentypen bzw. Bündel von
primitiven Datentypen. Mehr als Datenhalten können die nicht.
Klassen beinhalten keine Daten (zumindest ist das nicht ihr Hauptzweck),
sondern bilden ein Verhalten nach. Dafür sind zwar auch interne
Variablen nötig, irgendwie müssen die Zustandswerte ja gespeichert
werden (und deshalb kann man die auch vor der Öffentlichkeit verbergen).
Du solltest wirklich mal ein Buch über OOP lesen nicht nur über C++ als
reine Sprache. In letzteren steht zwar wie man eine Klasse definiert und
das man was public und private machen kann, wozu das aber gut sein soll
wird eher in ersteren dargestellt.
Ich hebe jetzt Zug für Zug erstmal alles auf C++ um und
lasse mir Zeit. Die ersten 2 Wochen C waren sehr viel schlimmer
(da war der PC einige Male kurz vor dem Flug durchs offene
Fenster).
Kriterien, was ich in eine Klasse packen kann und wo es Sinn
macht werden sich ergeben. Vielleicht wird das Leben dann
einfacher ;)
Alles braucht seine Zeit ...
Wühlhase schrieb:> @Sheeva:> Interessant. Ich will mir keinesfalls anmaßen den Vätern der OOP ihre> Kompetenz absprechen. Allerdings frag ich mich doch, wie die beiden zu> ihrer Einstellung kommen? Denn wie gesagt-ohne Vererbung würde vom Werk> der GoF nicht viel übrig bleiben, aber die Möglichkeit solche Konzepte> fahren zu können macht OOP doch zumindest zu einem beachtlichen Teil> aus. Zumindest bei heutigen Anwendungen.
Das besagte Buch der GoF ist bald 25 Jahre alt. Vieles was man heute
Vererbung vorziehen würde gabs damals schlichtweg nicht. Lambdas,
Type-Erasure und TMP zum Beispiel...
Ein meiner Ansicht nach recht großes Problem ist, dass man C++ noch
lehrt wie vor 25 Jahren. Auch die Beispiele im Internet sind voll davon.
"Sie erstellen eine Klasse für ein Moped und einen Kampfpanzer. Beide
Klassen Erben von der Klasse der Dieselfahrzeuge, welche wiederrum von
der Klasse der Landfahrzeuge erbt, die von der Klasse Fahrzeug erbt."
Und dabei wollte man eigentlich nur die "fahr()" Funktion für Moped und
Panzer aufrufen...
Interessant diesbezüglich ist übrigens folgender Talk:
https://www.infoq.com/presentations/gof-patterns-c-plus-plus-boostWühlhase schrieb:> Structs sind einfach nur selbstdefinierte Datentypen bzw. Bündel von> primitiven Datentypen. Mehr als Datenhalten können die nicht.
Das is maximal eine von dir erdachte Sichtweise. Mit der Realität hat
das aber nix zu tun.
Hallo zusammen :)
Ich bedanke mich nochmal für die hilfreichen Antworten und werde mich in
den nächsten Wochen mit HTML, CSS & Javascript beschäftigen.
Da sich hier so langsam ein Eigenleben entwickelt, möchte ich mich an
dieser Stelle ausklinken.
Es hat mich gefreut so schnell konstruktive Antworten bekommen zu haben
:)
Ich wünsche allen noch eine schöne Restwoche.
VG
Ein Gast
@weinga-unity
Danke für die Links ich hab sie mir für später schon mal abgespeichert
:)
Wühlhase schrieb:>>>> Ich lerne gerade C++, struct nennt sich halt jetzt Klasse.> Structs und Klassen sind nicht annähernd dasselbe.>> Structs sind einfach nur selbstdefinierte Datentypen bzw. Bündel von> primitiven Datentypen. Mehr als Datenhalten können die nicht.
struct und class unterscheiden sich nur durch die
default-access-specifier: ein struct ist eine all-public class.
Mit beidem definiert man Datentypen (im Sinne eines ADT):
user-defined-types (UDT). Und C++ hat ja die nette Eigenschaft,
primitive DT und UDT (fast) gleich zu behandeln (einer der Unterschiede
ist die default-initialisation). Und das wiederum ist die Grundlage für
die Effektivität von templates.
Wühlhase schrieb:> Structs sind einfach nur selbstdefinierte Datentypen bzw. Bündel von> primitiven Datentypen. Mehr als Datenhalten können die nicht.
Sicher können sie - Funktionszeiger kann man da auch unterbringen. So
ein OOP in C hab ich auch schon embedded gesehen. Im Linuxkernel wird
auf diese Weise ebenfalls OOP in C gemacht.
Was allerdings nicht geht:
- RAII, aber das nimmt man embedded eh selten, weil dynamische
Allokation an sich ungünstig ist
- Zugriffsrechte (public / private).
Nop schrieb:> Wühlhase schrieb:>>> Structs sind einfach nur selbstdefinierte Datentypen bzw. Bündel von>> primitiven Datentypen. Mehr als Datenhalten können die nicht.>> Sicher können sie - Funktionszeiger kann man da auch unterbringen. So> ein OOP in C hab ich auch schon embedded gesehen. Im Linuxkernel wird> auf diese Weise ebenfalls OOP in C gemacht.
So wie ich ihn verstanden hatte, meinte er C++.
> Was allerdings nicht geht:> - RAII, aber das nimmt man embedded eh selten, weil dynamische> Allokation an sich ungünstig ist> - Zugriffsrechte (public / private).
Selbstverständlich geht das.
Die Unterschiede zwischen class und struct:
Member:
struct: default public
class: default private
Vererbung:
struct: default public
class: default private
template-Präambel:
für template-type-parameter und template-template-parameter kein struct
als keyword möglich, wohl aber class oder typename
Nein, ich meinte schon C, mit C++ hab ich mich noch nie befasst. Das man
Funktionszeiger in Structs unterbringen kann hab ich völlig vergessen.
Liegt wohl daran, daß ich in C nie einen Funktionszeiger genutzt habe.
Es scheint in C wirklich deutlich mehr in Richtung OOP zu gehen als ich
dachte-aber ich bin dennoch froh, andere Sprachen wie Java dafür zu
haben. Immerhin, wieder was gelernt. Danke. :)
> Es scheint in C wirklich deutlich mehr in Richtung OOP zu gehen
Der Umgang mit Files (z.B. bei fprintf()) ist auch ein
Objektorientierter Ansatz in C.
Man hat Funktionen, die für Files geschrieben wurden. Und ihnen übergibt
man als ersten Parameter das File. In diesem Fall könnte man die
Struktur auch Objekt nennen.
Wilhelm M. schrieb:> Selbstverständlich geht das.
Und wie macht man das in C, daß man die Sichtbarkeit in structs auf
private bekommt? Und wie geht RAII in C-Structs?
Wühlhase schrieb:> Nein, ich meinte schon C, mit C++ hab ich mich noch nie befasst. Das man> Funktionszeiger in Structs unterbringen kann hab ich völlig vergessen.
Das war für mich nicht zu erkennen, denn der Kontext war:
>> Ich lerne gerade C++, struct nennt sich halt jetzt Klasse.> Structs und Klassen sind nicht annähernd dasselbe.
Und dann kam noch jemand mit RAII. Daher nahm ich an, es gehe um C++.
Nop schrieb:> Wilhelm M. schrieb:>>> Selbstverständlich geht das.>> Und wie macht man das in C, daß man die Sichtbarkeit in structs auf> private bekommt? Und wie geht RAII in C-Structs?
Man übersetzt sein C-Quelle mit einem C++-Compiler ;-)
Wühlhase schrieb:> @Sheeva:> Interessant. Ich will mir keinesfalls anmaßen den Vätern der OOP ihre> Kompetenz absprechen. Allerdings frag ich mich doch, wie die beiden zu> ihrer Einstellung kommen? Denn wie gesagt-ohne Vererbung würde vom Werk> der GoF nicht viel übrig bleiben, aber die Möglichkeit solche Konzepte> fahren zu können macht OOP doch zumindest zu einem beachtlichen Teil> aus. Zumindest bei heutigen Anwendungen.
Die GoF hat "nur" einige Muster beschrieben, wie man die OO mit den
Mitteln der verfügbaren Werkzeuge für bestimmte Standardsituationen
nutzen kann. Daß die meisten verfügbaren OO-Werkzeuge die Vererbung
unterstützen -- ich kenne jedenfalls keines, das das nicht tut -- führt
dann im Umkehrschluß dazu, daß die GoF dieses Feature in ihren Patterns
eben auch benutzen. Darin sehe ich keinen Widerspruch zu den Aussagen
der Väter der OO, die die Vererbung eben nicht für zwingend notwendig
halten.
Wühlhase schrieb:> Klassen beinhalten keine Daten (zumindest ist das nicht ihr Hauptzweck),> sondern bilden ein Verhalten nach.
Hm... ich würde eher sagen, daß Klassen letztlich sowohl Zustände
abbilden als auch das Verhalten, das diese Zustände ändert.
Stefanus F. schrieb:>> Es scheint in C wirklich deutlich mehr in Richtung OOP zu gehen>> Der Umgang mit Files (z.B. bei fprintf()) ist auch ein> Objektorientierter Ansatz in C.>> Man hat Funktionen, die für Files geschrieben wurden. Und ihnen übergibt> man als ersten Parameter das File. In diesem Fall könnte man die> Struktur auch Objekt nennen.
Ja, klar, so wird das ja letztlich auch von einem C++-Compiler
realisiert: man hat einen versteckten this-Zeiger.
Allerdings kann man aus der Tatsache, dass man man mit C ein
objektorientiertes Verhalten durch poor-man-Polymorphie nachbauen kann,
noch nicht darauf schließen, dass C objektorientierte Sprachmerkmale
hätte. Dann könnte man auch behaupten, dass Assembler objektorientierte
Merkmale besäße. Denn schließlich kann man auch ein C++ Programm in ein
reines C Programm überführen (der clang ++ hatte mal ein C-Backend).
Sheeva P. schrieb:> Wühlhase schrieb:>> @Sheeva:>> Interessant. Ich will mir keinesfalls anmaßen den Vätern der OOP ihre>> Kompetenz absprechen. Allerdings frag ich mich doch, wie die beiden zu>> ihrer Einstellung kommen? Denn wie gesagt-ohne Vererbung würde vom Werk>> der GoF nicht viel übrig bleiben, aber die Möglichkeit solche Konzepte>> fahren zu können macht OOP doch zumindest zu einem beachtlichen Teil>> aus. Zumindest bei heutigen Anwendungen.>> Die GoF hat "nur" einige Muster beschrieben, wie man die OO mit den> Mitteln der verfügbaren Werkzeuge für bestimmte Standardsituationen> nutzen kann. Daß die meisten verfügbaren OO-Werkzeuge die Vererbung> unterstützen -- ich kenne jedenfalls keines, das das nicht tut -- führt> dann im Umkehrschluß dazu, daß die GoF dieses Feature in ihren Patterns> eben auch benutzen. Darin sehe ich keinen Widerspruch zu den Aussagen> der Väter der OO, die die Vererbung eben nicht für zwingend notwendig> halten.
Ich denke, es wäre wichtig, den Unterschied zwischen Polymorphie und
Vererbung klar zu machen: normalerweise möchte man Typen polymorph
benutzen, ob das mit Vererbung realisiert wird, ist nur ein Detail.
Oder: ohne Vererbung wäre Polymorphie noch schöner. Z.B. führt Vererbung
eben zu einer Koppelung der beteiligten Typen bzw. man schafft sich
"unbeabsichtigte Datenstrukturen" durch die damit verbundene
Referenz-Semantik.
Hier ein Talk von Bjarne, in dem er das high-level verdeutlicht (vor
einem offensichtlich nicht so kundigem Auditorium):
Bjarne Stroustroup:
https://www.youtube.com/watch?v=xcpSLRpOMJM
Hier ein Talk von Sean, der das Problem im Detail erläutert:
Sean Parent:
https://www.youtube.com/watch?v=QGcVXgEVMJg
Mit concepts (ab g++-6.3 bzw. ab C++20) und templates wird die Bedeutung
von Vererbung als Realisierungsdetail für Polymorphie weiter verringert
werden.
Wilhelm M. schrieb:> Oder: ohne Vererbung wäre Polymorphie noch schöner. Z.B. führt Vererbung> eben zu einer Koppelung der beteiligten Typen bzw. man schafft sich> "unbeabsichtigte Datenstrukturen" durch die damit verbundene> Referenz-Semantik.
Spielst du auf Mehrfachvererbung an (ich kann mir deine Videos gerade
nicht anschauen), so daß man mehrere Vererbungsbäume in einer Klasse
zusammenwürfeln kann?
Java unterstützt das nicht, da ist jede Klasse stets von der Art ihrer
Superklasse. Wenn man zwei Klassen aus verschiedenen Vererbungsbäumen
die gleiche Fähigkeit verleihen will gibt es dafür ein Interface und
eine Methode kann prüfen, ob ein Objekt das Interface implementiert hat.
Das funktioniert zwar ähnlich wie Vererbung und bringt auch alle
Vorteile mit, ist aber keine Vererbung im eigentlichen Sinne. Daher
werden Interfaces auch meist als ...fähig (able) benamst um auszudrücken
das es eine Zusatzfähigkeit ist. Z.B. das Interface runnable wird
benutzt, wenn eine Klasse in einem eigenen Thread laufen soll.
Im o.g. Beispiel kann man in einer Klasse Schwimmpanzer, die man von der
Superklasse Landfahrzeuge abgeleitet hat, das Interface 'schwimmfähig'
implementieren. Das Ding ist nach wie vor ein Landfahrzeug-aber eben ein
schwimmfähiges Landfahrzeug.
Eine Methode kann jetzt Objekte entgegennehmen, die schwimmfähig sind.
Das kann auch ein Wasserflugzeug (von einer Art Luftfahrzeuge) sein,
solange es eben das Interface 'schwimmfähig' implementiert.
Was ich damit sagen will: Das Problem von dem ich glaube daß du das
meinst, hat weniger was mit Vererbung an sich, sondern eher mit der
Implementierung derselben in der Sprache zu tun wobei ich allerdings
nicht sicher bin, ob man bei Interfaces noch von Polymorphie im
eigentlichen Sinne sprechen kann, denn mit einem Interface ist ein
Objekt ja wieder typisiert.
Meines Erachtens einer der entscheidenden Unterschiede zwischen C++ und
Java, wobei ich mir aber sicher bin das C++ da mittlerweile auch was in
der Richtung anbietet. Die Mehrfachvererbung wird C++ aber wohl nicht
mehr los, jedenfalls nicht ohne abwärtskompatibel zu bleiben. Oder irre
ich da?
Wühlhase schrieb:> Wilhelm M. schrieb:>> Oder: ohne Vererbung wäre Polymorphie noch schöner. Z.B. führt Vererbung>> eben zu einer Koppelung der beteiligten Typen bzw. man schafft sich>> "unbeabsichtigte Datenstrukturen" durch die damit verbundene>> Referenz-Semantik.> Spielst du auf Mehrfachvererbung an (ich kann mir deine Videos gerade> nicht anschauen), so daß man mehrere Vererbungsbäume in einer Klasse> zusammenwürfeln kann?
Nein, hat damit gar nichts zu tun.
> Java unterstützt das nicht, da ist jede Klasse stets von der Art ihrer> Superklasse. Wenn man zwei Klassen aus verschiedenen Vererbungsbäumen> die gleiche Fähigkeit verleihen will gibt es dafür ein Interface und> eine Methode kann prüfen, ob ein Objekt das Interface implementiert hat.
Naja, in Java hat man die Mehrfachvererbung kastriert: eine Basisklasse,
viele Interfaces.
> Das funktioniert zwar ähnlich wie Vererbung
es ist im eigentlichen Sinne Vererbung, nur hat man dort Java gegenüber
C++ mal wieder vereinfacht.
> und bringt auch alle> Vorteile mit, ist aber keine Vererbung im eigentlichen Sinne. Daher> werden Interfaces auch meist als ...fähig (able) benamst um auszudrücken> Was ich damit sagen will: Das Problem von dem ich glaube daß du das> meinst, hat weniger was mit Vererbung an sich, sondern eher mit der> Implementierung derselben in der Sprache zu tun wobei ich allerdings> nicht sicher bin, ob man bei Interfaces noch von Polymorphie im> eigentlichen Sinne sprechen kann, denn mit einem Interface ist ein> Objekt ja wieder typisiert.
Das Problem ist die Vererbung, da sie zu einer engen Koppelung der
Klassen führt. Bei Java hat man die Notlösung eingebaut, dass alles
implizit von Object erbt. Damit sind alle Klassen gekoppelt.
In C++ ist das nicht so: hat man fremde Klassen, so kann man sie nicht
mehr einem Interface unterordnen. Man hat keine Möglichkeit, die enge
Koppelung über eine Basisklasse (Interface) herzustellen. Und eigentlich
will man diese enge Koppelung ja auch gar nur, man würde durch die
Vererbung nur dazu gezwungen.
Aber eigentlich möchte man nur ausdrücken, dass zwei Klassen eine
gemeinsame Eigenschaft besitzen, etwa eine Elementfunktion draw(...)
besitzen. Dass kann man mit Vererbung machen, muss man aber nicht. Also
ist Vererbung nur ein Weg, Polymorphie zu realisieren.
> Meines Erachtens einer der entscheidenden Unterschiede zwischen C++ und> Java, wobei ich mir aber sicher bin das C++ da mittlerweile auch was in> der Richtung anbietet.
Wie immer bietet C++ hier mehr an als Java. Ich verstehe nicht genau was
Du meinst, aber natürlich gibt es in C++ Interfaces und abstrakte
Klassen.
> Die Mehrfachvererbung wird C++ aber wohl nicht> mehr los, jedenfalls nicht ohne abwärtskompatibel zu bleiben. Oder irre> ich da?
Will man ja auch gar nicht, denn man braucht sie!