Re(3): Java-Dau-Anfängerproblem...
Geizhals » Forum » Programmierung » Java-Dau-Anfängerproblem... (63 Beiträge, 280 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(3): Java-Dau-Anfängerproblem...
12.07.2005, 12:09:04
Zu 3.) Meiner Meinung nach ist da kein Unterschied zu C++. Dort gibt's auch eine add-Methode für JEDE Klasse, also auch Trillionen verschiedene. Nur heissen sie alle gleich, es gibt den genannten Pferdefuss UND es besteht Verwechslungsgefahr (nebenbei finde ich es unübersichtlicher). An der Funktionalität ändert sich also nichts...

Zu private: Private Methoden sind in Kindklassen auch nicht sichtbar. Das heisst, es ist auch in Java möglich, dass eine private Methode der Elternklasse und eine private Methode der Kindklasse gleich heissen, aber unterschiedliche Rückgabewerte haben. Hat auch seinen Grund. Private Methoden sind Methoden, mit deren Hilfe die Klasse ihre Aufgaben erfüllt, stellen aber keine Schnittstelle nach aussen dar. Deshalb erlaubt Java auch das private Methoden in Eltern-Kind-Klassen gleich heissen. Alles andere wäre auch unsinnig. Ich kann bei einer Klassen, deren Sourcecode ich nicht besitze (nur class-Datei) ja gar nicht wissen, dass es diese Methode überhaupt gibt. Trotzdem darf ich ja von dieser Klasse ableiten.

*TRÖT*setzung ist aber, dass beide Methoden (Eltern- und Kindklasse) privat sind. Ansonsten könnte ich ja durch Vererbung die Sichtbarkeit ändern und das ist verboten.

Zum Zitat: "Insofern wird deine Regel..."

Es sind nicht meine Regeln. Ich habe Java nicht erfunden. Ich bin SW-Entwickler und mache gerade eine Expertenausbildung für Java (Ziel ist, die diversen Zertifikate zu erreichen) und war bisher vor allem in C++ unterwegs. Ich weiss deshalb schon ein wenig darüber Bescheid. Ich versuche nur, dir mit meinem Wissen zu helfen so gut ich kann. Ich hoffe, dass wir beide davon profitieren. Ich kann aus deinen Problemen lernen und du auch vielleicht ein bischen von meinem Input profitieren.

Zu 1) Ich hoffe, ich habe dich richtig verstanden. Also: In C++ ist dieser Pferdefuss möglich, weil Methoden dort virtuell (Schlüsselwort: virtual) sein KÖNNEN. Wenn ich mir dessen bewusst bin, ist das ja gar kein Problem. Sonderlich intuitiv finde ich es aber auch nicht (meine Meinung).
In Java sind Methodenaufrufe immer virtuell (das Schlüsselwort gibt's deshalb auch nicht). Deshalb kann ich mich in Java als Aufrufer NIE an dem eigentlichen Typ des Objekts vorbeibewegen. Das Stichwort super in Java kann nur innerhalb einer Klasse verwendet werden, um Methoden bzw. Felder der Elternklasse zu referenzieren, die ich sonst nicht erreichen könnte (weil sie überschrieben wurden).

Nur aus Neugier: Wie könnte ich die Java-Lösung jetzt unabsichtlich falsch benutzen?

Antworten PM Alle Chronologisch Zum Vorgänger
 
Melden nicht möglich
.....  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