Re(9): Scheinbar sieht die Lösung echt so aus...
Geizhals » Forum » Programmierung » Java-Dau-Anfängerproblem... (63 Beiträge, 283 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
Java-Dau-Anfängerproblem...
11.07.2005, 13:50:53
Hi, Folks !

Habe mich in letzter Zeit wieder besseren Wissens in Java eingearbeitet...
Und hab' grad ein Micky-Maus-Prob:


public class Vater {

protected Vater() {}

public static boolean add ( int x ) {
return true;
}
}

public class Sohn extends Vater {

public static void main(String[] args) {
Sohn s = new Sohn();
Sohn.add(2);
}

public static int add ( int x ) {
return x;
}
}

---> Das ist nicht erlaubt - er motzt, weil die Methode add bei gleichen Parameter in Vater einen anderen Rückgabewert liefert als in Sohn...

Also in c++ wäre das erlaubt ;-).

Wozu braucht ma des ?

Also als Java-Laie dachte ich mir das wie folgt (und mußte daher schon viel umschreiben):
Es gibt eine Klasse Person - mit private-Gschichtln wie Zuname, Vorname, Gebdatum, ...
Person habe einen protected-Constructor - damit niemand selbst eine Person anlegen kann. Stattdessen gibt es eine Klassenmethode
> public static Person add(String Zuname, String Vorname, GregorianCal... GebDatum) - die zuerst mal nachsieht (in einem HashSet), ob es die Person schon gibt. wenn es sie gibt, liefert sie die bekannte Person zurück - wenn nicht, legt sie eine neue an und liefert die zurück. Grund: Auf diese Art will ich doppelte Personen vermeiden.

von Person gibt es eine abgeleitete Klasse Personal: sie hat dieselben Gschichtln wie Person - plus Job/Funktion, ...
Sie hat wieder einen protected Konstruktor - gleicher Grund wie bei Person.
Personal habe eine Reihe von Klassenmethoden "add"  -
so auch ein
> public static Personal add(String Zuname, String Vorname, GregorianCal... GebDatum)
---> Und genau da fetzt diese "$&%"!! Java-VM - eben wegen dem Rückgabewert von add().

Mir ist das ja komplett unklar...
Erstens sprech' ich hier von Klassenmethoden - also nix mit VMT. Irgendeine ominöse Forderung, warum das verboten sei in sauberen Design will noch nicht in meinen kleinen Schädel.
Zweitens ist mir der Workaround unklar...
Person::add() private machen nutzt auch nix - wieso net ???
Drittens scheint ein Object zurückliefern zwar als möglich aber bescheiden - denn jeder Aufrufende muß dann casten bzw. ein instanceOf scheint problematisch...
EDIT:
Viertens bin ich jetzt auf ein addPerson(), addPersonal(), ... ausgewichen - nur das ist ja auch besch*en... denn wozu sollte jede Klasse dann Trilliarden vererbter Methoden mitführen müssen ?

Ach ja, das bequeme Äquivalent in C++, das funktioniert:
class vater {
        public:
        static int add(int x);
};

int vater::add(int x)
{
        return 2;
}

class sohn: public vater
{
        public:
        static float add(int x);
};

float sohn::add(int x)
{
        return 2.3f;
}

int main() {
        sohn *s = new sohn();
        float f = s->add(2);
}



So oder so - ich denke wahrscheinlich zu C++-lastig...
wie macht man das sauber in Java ? Und /was/ ist der Hintergedanke von dieser IMHO stupiden, sinnlosen Limitierung ???

cu
ein frustrierter gepeinigter

11.07.2005, 14:10 Uhr - Editiert von gepeinigter_aon_neukunde, alte Version: hier
Antworten PM Alle Chronologisch
 
Melden nicht möglich
.  Re: Java-Dau-Anfängerproblem...  (Frankster am 11.07.2005, 14:07:47)
...  Re(3): Java-Dau-Anfängerproblem...  (Frankster am 11.07.2005, 14:19:36)
.....  Re(5): Java-Dau-Anfängerproblem...  (Frankster am 11.07.2005, 15:06:11)
.  Re: Java-Dau-Anfängerproblem...  (DeaconFrost am 11.07.2005, 17:13:42)
............
Re(9): Scheinbar sieht die Lösung echt so aus...
12.07.2005, 17:00:40
I see your point. Ist sicher auch in machen Fällen ein Nachteil. Trotzdem: Der Ansatz ist halt ein anderer. Eine Ableitung bedeutet ja immer: verhält sich wie ein. In machen Fällen wär's sicher praktisch (und auch kein Problem), wenn ich mich gleichzeitig wie A und B verhalte(n muss). Problematisch wird's nur, wenn A und B teilweise konträres Verhalten voraussetzen. Diese Probleme wollte man in Java eben von vornherein ausschliessen.

Zum Glück gibt's aber noch die Aggregation: Ich muss ja nicht unbedingt erben, um Funktionalitäten anderer Klassen nutzen. Ich kann ja auch einfach Objekte dieser Klassen inkludieren und dann deren Methoden aufrufen.

Ausserdem: Ich kann mir nicht vorstellen, das die Java-Bibliothek verlangt, dass ich Funktionalitäten von 2 Klassen gleichzeitig einerben muss. Das kann ich mir nur selbst einfallen lassen und dann gibt's sicher auch eine andere Lösung ohne Stress ;-)

Zum Edit:
Ist wohl nur eine Frage der Sichtweise. Ich find synchronized z.B. eine wunderschöne Sache, weil das Thema Synchronisation gleich in der Sprache inkludiert ist. In C++ kann ich sowas ja nur über selbstgebaute Konstrukte lösen.

Und der Fallenreichtum von C++?
Memory-leaks und dangling pointers.
Nicht-virtuelle Destruktoren sind absolut sinnlos, in C++ aber möglich.
Probleme mit (impliziten) Casts.
Überläufe von Arrays.
Fall-Through bei switch-case.
Zuweisungen in if-Anweisungen, die eigentlich Vergleiche sein sollten.
Nicht-boolsche Ausdrücke in if/for/while/do-while sind erlaubt, aber eine furchtbare Falle.
Makros, die nur 1 Zeile lang sind können 1000 Zeilen Code hundertfach in den Code einschleusen und sind nicht typsicher.
Überladene Operatoren schaffen Verwirrung.
Und erklär einem Anfänger mal die diversen Konstrukte der STL...

Du siehst. Wenn ich Schwierigkeiten finden will, geht das auch in C++ ;-)

EDIT:
Ach ja, nochwas. Ich glaube, dein größtes Problem ist nicht Java, sondern deine C++-Kenntnisse. ;-)
Ich kenn zumindest keinen Anfänger, der sofort fragt: "Und? Wie mach ich Mehrfachvererbung?"
Ich denke, das ist wie beim Englisch lernen. Wenn du in Deutsch denkst und das dann Wort für Wort in Englisch übersetzt holpert's gewaltig. Sobald du aber in Englisch zu denken beginnst, konstruierst du die Sätze schon von Grund auf ganz anders.
Genauso ist es hier. Wenn du mit C++-Design-Patterns im Kopf eine Implementierung in Java versuchst, schreit ständig der Compiler und du denkst: "Ist ja schlechter als in C++. Da wär's gegangen!" ;-)
Vielleicht solltest du dir mal guten Java-Code anschauen und studieren? Auf der Sun-Homepage (java.sun.com) gibt's sicher entsprechendes in den Tutorials...

12.07.2005, 17:26 Uhr - Editiert von DeaconFrost, alte Version: hier
Antworten PM Alle Chronologisch Zum Vorgänger
 
Melden nicht möglich
...  Re(3): Java-Dau-Anfängerproblem...  (DeaconFrost am 12.07.2005, 12:09:04)
.....  Re(5): Java-Dau-Anfängerproblem...  (DeaconFrost am 12.07.2005, 13:29:44)
.......  Re(7): Java-Dau-Anfängerproblem...  (DeaconFrost am 12.07.2005, 14:28:09)
.........  Re(9): Java-Dau-Anfängerproblem...  (DeaconFrost am 12.07.2005, 15:11:21)
.  Re: Java-Dau-Anfängerproblem...  (adhoc am 13.07.2005, 12:03:34)
...  Re(3): Java-Dau-Anfängerproblem...  (adhoc am 13.07.2005, 13:31:54)
...  Re(3): Java-Dau-Anfängerproblem...  (adhoc am 13.07.2005, 13:40:48)
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung