NG Programmiersprache?



  • ~john schrieb:

    D ist aus meiner Sicht eine Verschlimmbesserung, zuwenig Neues nur vieles anders das rechtfertigt die Inkompatibilität nicht.

    Unabhängig von meiner Meinung über 😨 Bitte an dieser Stelle keinen D-Flamewar anfangen, davon hatten wir schon einige.



  • ~john schrieb:

    [*]Mehrfachvererbung

    Wozu brauchst du das?



  • thatway schrieb:

    ~john schrieb:

    [*]Mehrfachvererbung

    Wozu brauchst du das?

    Ein Beispiel wäre wenn du ein fliegendes Auto modellieren(oder ein GUI-Button der mit Klicks und Gesten zurechtkommt) möchtest dann brauchst du nicht zwei Schnittstellen neu implementieren sondern erbst von der Klasse Fahrzeug und Flugzeug. Dabei ist bestimmt ein wenig Vorsicht geboten, aber Sprachen wie C++ sind ja auch nix für den Rookie unter den Programmierern. So ein Feature ist manchmal einfach nice to have.



  • Jaja, das Amphibienfahrzeug jetzt mal als fliegendes Auto. Wieviel PS hat das dann? Soviel wie das Fahrzeug oder das Flugzeug oder ...?

    Mach mal ein Beispiel zu deinem GUI-Button der mit Klicks und Gesten zurechtkommt.



  • freizeit_programmierer schrieb:

    thatway schrieb:

    ~john schrieb:

    [*]Mehrfachvererbung

    Wozu brauchst du das?

    Ein Beispiel wäre wenn du ein fliegendes Auto modellieren(oder ein GUI-Button der mit Klicks und Gesten zurechtkommt) möchtest dann brauchst du nicht zwei Schnittstellen neu implementieren sondern erbst von der Klasse Fahrzeug und Flugzeug. Dabei ist bestimmt ein wenig Vorsicht geboten, aber Sprachen wie C++ sind ja auch nix für den Rookie unter den Programmierern. So ein Feature ist manchmal einfach nice to have.

    eigentlich entweder oder daher auch 2 variablen

    class Amphibienfahrzeug{
    var Fahrzeug = new Fahrzeug()
    var Flugzeug = new Flugzeug()
    }

    wollt aber eigentlich nur mal schauen wie das so mit den signaturen ist 🤡



  • thatway schrieb:

    Wozu brauchst du das?

    Bisher wurde in jeder populären OO-Programmiersprache Interfaces nachgerüstet oder war gleich Teil der Sprache. Mehrfachvererbung ist kein Problem zur Laufzeit, d.h. es kostet keine Performance. Bei Interfaces wird meistens eine Beschränkung der Namen für die Methoden eingeführt, das Konzept kann man für echte Mehrfachvererbung auch auf Elemente ausweiten, oder man nutzt die bekannten Maßnahmen aus den Sprachen mit Mehrfachvererbung um Konflikte aufzulösen. Als Entwickler sollte man soviel Wissen haben, daß man den Diamond of Death vermeidet.



  • ~john schrieb:

    thatway schrieb:

    Wozu brauchst du das?

    Bisher wurde in jeder populären OO-Programmiersprache Interfaces nachgerüstet oder war gleich Teil der Sprache. Mehrfachvererbung ist kein Problem zur Laufzeit, d.h. es kostet keine Performance. Bei Interfaces wird meistens eine Beschränkung der Namen für die Methoden eingeführt, das Konzept kann man für echte Mehrfachvererbung auch auf Elemente ausweiten, oder man nutzt die bekannten Maßnahmen aus den Sprachen mit Mehrfachvererbung um Konflikte aufzulösen. Als Entwickler sollte man soviel Wissen haben, daß man den Diamond of Death vermeidet.

    Ja und? Das führt immer nur zu diesen Superklassen die alles sind anstatt das die Funktionalität aufgeteilt wird. Die meisten "Is-A" Beziehungen könnten auch "Has-A" Bezeihungen sein.


  • Administrator

    ~john schrieb:

    • eine Art von Precompiler, der alle Typen der Sprache kennt und Typsicher Programmcode aus einem Metaprogramm herauserzeugen kann.

    Das wäre definitiv sehr interessant. Wenn wir von zum Beispiel C++ ausgehen, dann die Makros und Templates rausschmeissen, dafür in die eigentliche Sprache hinein eine Code-Generator Sprache implementieren. Ich habe mir sogar schon mal Gedanken darüber gemacht, eine Sprache zu entwickeln, welche nur als Code-Generator dient. Man programmiert dann ein Programm, welches vom Kompiler ausgeführt wird, damit daraus ein Programm zum Übersetzen in die Maschinensprache entsteht. 🙂
    Leider fehlt mir ein wenig die Zeit, diese Gedanken mal besser zu ordnen und niederzuschreiben.

    thatway schrieb:

    ~john schrieb:

    [*]Mehrfachvererbung

    Wozu brauchst du das?

    Gegenfrage: Wieso sollte man es verbieten? Und komm mir bitte nicht mit der Begründung, weil der Programmierer zu dumm ist, dieses Konzept vernünftig anzuwenden, denn dann darfst du ihn erst gar nicht programmieren lassen 😉

    Grüssli



  • Dravere schrieb:

    thatway schrieb:

    ~john schrieb:

    [*]Mehrfachvererbung

    Wozu brauchst du das?

    Gegenfrage: Wieso sollte man es verbieten? Und komm mir bitte nicht mit der Begründung, weil der Programmierer zu dumm ist, dieses Konzept vernünftig anzuwenden, denn dann darfst du ihn erst gar nicht programmieren lassen 😉

    Grüssli

    Weil man es nicht braucht. Keiner konnte mir bisher einen Fall nennen bei dem es vernünftig ist Mehrfachvererbung zu verwenden und es sonst keine bessere Lösung gibt.



  • Wie löst du denn das wenn du Methoden und/oder Eigenschaften von zwei Basisklassen brauchst ohne irgendwas neu implementieren zu müssen?

    Beispiele wurde hier schon genannt und jedem fällt da bestimmt auch noch was ein, außer dir anscheinend. Also entweder willste nicht oder kannst nicht, such es dir aus.

    Mir würde noch einfallen der Fleisch- und Pflanzenfresser. Der Mensch würde dann aus beiden Klassen erben.



  • Wahrscheinlich ist er so ein nur Virtuell-Maschine Programmierer oder halt ein Script-Kiddie oder halt einfach ein Troll der von nix eine Ahnung hat. Bitte gebt sowas keine Bühne hier, das ist das einzige Forum in deutsch wo die wirklichen Profis zu finden sind.



  • mehrfach schrieb:

    Wie löst du denn das wenn du Methoden und/oder Eigenschaften von zwei Basisklassen brauchst ohne irgendwas neu implementieren zu müssen?

    Beispiele wurde hier schon genannt und jedem fällt da bestimmt auch noch was ein, außer dir anscheinend. Also entweder willste nicht oder kannst nicht, such es dir aus.

    Mir würde noch einfallen der Fleisch- und Pflanzenfresser. Der Mensch würde dann aus beiden Klassen erben.

    Ja, immer so schöne Beispiele wie wir sie doch immer programmieren. Ich kann mich noch gut an mein letztes fliegendes Auto das von einem Fleischfresser gesteuert wurde errinnern. Es kommen immer nur so Anfängerbeispiel bei denen ein "Mensch" oder ein "Amphibienfahrzeug" programmiert wird. Vorher wurde "ein GUI-Button der mit Klicks und Gesten zurechtkommt" erwähnt, aber nicht wieso man da Mehrfachvererbung braucht.

    wortmeldung schrieb:

    Wahrscheinlich ist er so ein nur Virtuell-Maschine Programmierer oder halt ein Script-Kiddie oder halt einfach ein Troll der von nix eine Ahnung hat. Bitte gebt sowas keine Bühne hier, das ist das einzige Forum in deutsch wo die wirklichen Profis zu finden sind.

    Das Gefühl hab ich auch, dass es hier nur darum geht, dass C++ Mehrfachvererbung hat und die Leute es deswegen toll finden. Komischerweise finde ich in unserem C++ Code nur sehr selten Mehrfachvererbung und dann nur solche Stellen bei denen was zusammengehackt wurde.



  • In Java z.B. wäre Mehrfachvererbung auch nicht schlecht, zumindest für diesen Fall:

    public class MyFrame extends JFrame implements MouseListener, KeyListener
    {
      // viele leere Methoden
      // bei mehrfachvererbung könnte man schreiben extends MouseAdapter, KeyAdapter
    }
    

    Oder bei meinem letzten Projekt mit C++ musste ich auch sowas schreiben:

    class Window : public wxFrame, public irrklang::ISoundStopReceiver
    {
      // ...
    

    Zeige mir doch bitte eine Alternative ohne Mehraufwand die das selbe macht.
    Also so unnötig ist Mehrfachvererbung gar nicht.



  • Genau das macht man mit Mehrfachvererbung, immer diese Klassen die alles sind, weil man da ja so schön wenig Tipparbeit hat und alles lustig auf alles zugreifen kann. Warum muss ein Fenster irgendwelche Logik für SoundStop enthalten?

    Wie schon anfangs gesagt. Has-A vs. Is-A.
    Einfach mal das lesen: http://www.c-plusplus.net/forum/viewtopic-var-p-is-532117.html



  • Das Fenster beinhaltet die entsprechenden Objekte um Sounds abzuspielen. Also warum sollte nicht auch der Listener in der Fensterklasse sein?
    Der Übersichtlichkeit des Codes dient es jedenfalls nicht, wenn ich extra für den Listener eine extra Klasse hernehme. Das wäre nix weiter als ein frickeliger Workaround. Frei nach dem Motto: Warum einfach wenns auch kompliziert geht? Zu bedenken ist auch das ich dieser Klasse dann noch eine Referenz auf das Fenster mitgeben müsste.
    Alles in allem wäre das Programmier- und Speicheraufwändiger als meine Lösung. Also WARUM sollte man es tun??
    Der einzige der es so lösen würde wäre eins dieser "OOP ist die Lösung aller Informatikprobleme"-Opfer die sowieso keine Lösung "elegant" genug finden.

    P.S. Auf mein Java-Beispiel bist du gar nicht eingegangen.



  • player4245 schrieb:

    In Java z.B. wäre Mehrfachvererbung auch nicht schlecht, zumindest für diesen Fall:

    public class MyFrame extends JFrame implements MouseListener, KeyListener
    {
      // viele leere Methoden
      // bei mehrfachvererbung könnte man schreiben extends MouseAdapter, KeyAdapter
    }
    

    Das würde man mit anonymen Klassen machen. Dein Bsp. macht absolut kein Sinn, da das Frame sowieso noch Komponenten hat, auf die die Listener viel besser zugeordnet werden können. Im schlechtesten Fall erhält das Frame sowieso nie den Fokus, die Listener würden also nie aufgerufen werden.

    player4245 schrieb:

    Der Übersichtlichkeit des Codes dient es jedenfalls nicht, wenn ich extra für den Listener eine extra Klasse hernehme.

    Genau dafür gibt es anonyme Klassen. Diese sind übersichtlicher. Weil man damit genau feststellen kann welcher Listener zu welcher Komponente gehört.

    Scala löst Mehrfachvererbung durch traits, die dem Prinzip der Linearisierung folgen. Das heißt, wenn es mehrere gleichnamige Methoden gibt, dann werden diese nacheinander aufgerufen und deren Werte werden weitergereicht.



  • player4245 schrieb:

    Das Fenster beinhaltet die entsprechenden Objekte um Sounds abzuspielen.

    Das ist ja schon der Fehler. Modularisierung. http://de.wikipedia.org/wiki/Model_View_Controller . Das Fenster ist nicht der Controller für Sound.

    P.S. Auf mein Java-Beispiel bist du gar nicht eingegangen.

    Weil alles das gleiche Problem ist. Du machst eine Klasse zur Superklasse die für alles verantwortlich ist, statt zu modularisieren.



  • Antoras schrieb:

    player4245 schrieb:

    In Java z.B. wäre Mehrfachvererbung auch nicht schlecht, zumindest für diesen Fall:

    public class MyFrame extends JFrame implements MouseListener, KeyListener
    {
      // viele leere Methoden
      // bei mehrfachvererbung könnte man schreiben extends MouseAdapter, KeyAdapter
    }
    

    Das würde man mit anonymen Klassen machen. Dein Bsp. macht absolut kein Sinn, da das Frame sowieso noch Komponenten hat, auf die die Listener viel besser zugeordnet werden können. Im schlechtesten Fall erhält das Frame sowieso nie den Fokus, die Listener würden also nie aufgerufen werden.

    OK das Fenster hat noch Komponenten. Alles klar:

    public class MeinPanel extends JPanel implements MouseListener
    {
      // ..
    }
    

    😉

    Anonyme Klassen sind vielleicht auch eine Lösung, aber besonders in diesem Beispiel lang nicht so übersichtlich.
    Nun was C++ angeht, diese Sprache besitzt dieses Feature ja nicht, also ist Mehrfachvererbung dort dann doch noch der Weisheit letzter Schluss.



  • thatway schrieb:

    Das führt immer nur zu diesen Superklassen die alles sind anstatt das die Funktionalität aufgeteilt wird.

    Eben dies ist nicht der Fall. Der Klassiker ist wohl das Problem der Serialisierung. In den meisten Programmiersprachen wird dies per Interface gelöst, welches dann von jeder konkreten Klasse implementiert werden muß. Das ist ganz klassisch eine "ist-ein"-Beziehung. Und es gibt keinen wirklichen Grund das ganze auf Interfaces zu beschränken, echte Klasse funktionieren genauso gut.



  • Vererbung sollte man möglichst umgehen, da man sich nie sicher sein kann ob man die Superklasse vllt. nicht doch noch mal ändern muss.

    class InheritanceTest extends JFrame {
    	public InheritanceTest() {
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		setSize(x, y);
    		setVisible(true);
    	}
    }
    

    Was wenn du irgendwann feststellst, dass ein JPanel als Superklasse besser wäre? Das bekommst du dann nur unter enormen Aufwand refactored. Bei einer Assoziation hingegen musst du nur wenig ändern.

    class AssociationTest {
    	public AssociationTest() {
    		JFrame f = new JFrame();
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		f.setSize(x, y)
    		f.setVisible(true);
    	}
    }
    

    Und dabei kann dir die IDE helfen. Im besten Fall musst du einfach nur die Erzeugung von Objekten umschreiben und brauchst den bestehenden Code des JFrames gar nicht zu ändern.


Anmelden zum Antworten