PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java]: Vererbung und Casts.



Lin728
23-02-2004, 10:18
Ich habe eine Klasse Fahrzeit und eine Klasse auto welche von Fahrzeug abgeletet ist.
Beide Klassen implementieren Gewicht, auto überschreibt als das gewicht von fahrzeug.

welche methode wird denn nun aufgerufen:

Fahrzeug z = new auto();
z.getGewicht()

SeeksTheMoon
23-02-2004, 10:51
Das Teil ist ein Fahrzeug, also wird die Methode von Fahrzeug aufgerufen.

Das kannst Du mit einer einfachen Ausgabe auch ausprobieren.

peschmae
23-02-2004, 11:22
Nein. Natürlich die Methode von Auto - sonst würde ja das ganze OOP-Zeugs keinen Sinn machen.

Ich habs übrigens ausprobiert - SeeksTheMoon hats wenigstens geschafft mich zu verunsichern:


public class Fahrzeug {
public void gewicht() {
System.out.println("Ich bin abstrakt");
}
}

und zweite Klasse:

public class Auto extends Fahrzeug {
public void gewicht() {
System.out.println("Schweres Auto");
}

public static void main(String[] args) {
Fahrzeug f = new Auto();
f.gewicht();
}
}


(Late binding und vtable könnte man da ja auch gleich in die Tonne treten, oder?)

MfG Peschmä

bischi
23-02-2004, 14:41
Soweit ich das verstanden hab, macht erben folgendes:

Es übernimmt die Klasse so wie sie ist (schreibt sie auf eine Art virtuell ab), ergänzt sie um die Neuerungen und ersetzt Konstruktoren, Funktionen, Methoden, die überschrieben wurden. Somit hast du eine absolut neue Klasse - die alte brauchst du nur noch um die neue zu kompilieren - sonst ist sie überflüssig.

MfG Bischi

peschmae
23-02-2004, 15:27
Die Klasse von der du ableitest ist nicht überflüssig - oft hat es noch Methoden oder so die nicht überschrieben wurden, oder die Kindklasse benutzt Methoden (protected oder auch überschriebene) der Parent-Klasse.

Ausserdem brauchst du die Parent-Klasse damit du dorthin upcasten kannst. In dem was du geschrieben hast, fehlt aber genau ceisserers Frage: Welche der Methoden wird aufgerufen, wenn ich eine Klasse (Auto) zur Parentclasse (Fahrzeug) upcaste.

MfG Peschmä

Lin728
23-02-2004, 17:59
Ja, ich war mir auch ziemlich sicher, aber halt nicht ganz.
Es muss ja fast so sein, sonst hätte man gehörig Probleme beim downcasten.

SeeksTheMoon
23-02-2004, 18:51
Das ist ja weird; da wär ich nie drauf gekommen (aber ich hätte das auch im Traum nie so gemacht *g*), vor allem weil es in C++ genau so ist, wie ich das gesagt habe:



#include <iostream>
using namespace std;

class Fahrzeug {
public: void gewicht() {
cout<<"Ich bin abstrakt"<<endl;
}
};

class Auto : public Fahrzeug {
public: void gewicht() {
cout<<"Ich bin ein Auto"<<endl;
}

};

int main() {
Fahrzeug *f = new Auto();
f->gewicht();
return 0;
}

Ausgabe: "Ich bin abstrakt", nicht wie in Java "Ich bin ein Auto".
Ohne Zeiger geht diese Aktion in C++ übrigens nicht, bei einer direkten Zuweisung kommt die Meldung

Auto.cpp: In function `int main()':
Auto.cpp:18: error: conversion from `Auto*' to non-scalar type `Fahrzeug'
requested
Auch mit dem Bereichsoperator (Auto::gewicht()) kann man so nicht die Auto-Klasse ansprechen:
error: type `Auto' is not a base type for type `Fahrzeug'

wraith
23-02-2004, 18:59
Original geschrieben von SeeksTheMoon
Das ist ja weird; da wär ich nie drauf gekommen (aber ich hätte das auch im Traum nie so gemacht *g*), vor allem weil es in C++ genau so ist, wie ich das gesagt habe:

Wie wäres,wenn du in der Basisklasse gewicht als virtual deklarierst?
In Java ist das default so.

SeeksTheMoon
23-02-2004, 19:32
aaah, dann bedeutet das bei Java implizit Polymorphie.
Bei C++ ruft er jetzt auch die Methode von Auto auf (wie erwartet).
Wieder was kleines, aber wichtiges gelernt. :D

anda_skoa
23-02-2004, 20:08
Das ist bei den beiden Sprachen immer eine Überraschung, egal von welcher Seite man kommt :)

Bei Java ist aus Sicht des C++ Programmierers alles virtual, bei C++ aus Sicht des Java Programmierers alles final.

Drüfte mit den Designideen der jeweiligen Sprache zusammenhängen.
Die virtuellen Methoden sind zusätzlicher Speicheroverhead, den man in C++ dem Entwickler nicht auzwingen möchte, wenn er nicht will.
In Java leitet aber alles von Object ab, d.h. jede Instanz hat ohnehin schon einen vtable.

Ciao,
_

sauertopf
03-03-2004, 12:59
Original geschrieben von anda_skoa
[...]
nicht auzwingen möchte, wenn er nicht will.
[...]

Nette Tautologie.

peschmae
03-03-2004, 13:17
Nee.

MfG Peschmä

sauertopf
03-03-2004, 13:36
Tautologie
Übersetzung: englisch tautology
Herkunft: griech_tautó logos_= dasselbe Logos
Definition:
Eine durch hohe triviale Redundanz charakterisierte Aussage.

http://www.ib.hu-berlin.de/~wumsta/infopub/semiothes/lexicon/default/dx1.html

Also "hohe triviale" Redundanz will ich nicht unterstellen, aber es ist schon so, dass man jemandem etwas nur dann aufzwingen kann, wenn er nicht will.

peschmae
03-03-2004, 16:20
Naja. Lassen wir das.

imo kann man aber jemandem auch Sachen aufzwingen, die er will - nämlich indem man jemandem die Wahlfreiheit entzieht. Egal. :D

MfG Peschmä

P.S. redundanz ist im Informatikbereich meist etwas positives :)

SeeksTheMoon
03-03-2004, 17:00
nicht bei Datenbanken

peschmae
03-03-2004, 18:56
meist :)

Abgesehen davon ist es auch positiv wenns um die Hardware geht auf der die Datenbank läuft :D

MfG Peschmä

sauertopf
04-03-2004, 07:42
Original geschrieben von SeeksTheMoon
nicht bei Datenbanken
Erst recht nicht bei Code.

peschmae
04-03-2004, 09:22
Kommt jetzt drauf an. :)

Bei Code nicht, aber bei was laufendem (Software, Hardware) schon... :D

MfG Peschmä

Lin728
04-03-2004, 11:24
???