Frage zu Überladen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
cz3kit
User
Beiträge: 74
Registriert: Freitag 9. Januar 2009, 16:24

Hi, ich hab ne Frage die das Überladen betrifft, also eigentlich eher wann man davon spricht.
Wenn man in einer Klasse die Operatoren neu schreibt dan spricht man doch von Überladen, oder?

Und wie sieht es dan mit dem Beispiel aus?

Code: Alles auswählen

class Hallo():
    def __init__(self):
        raise "Not Implemented"
    
    def draw(self):
         pass

class Weiter(Hallo):
    def __init__(self):
        self.wert = 1
    
    def draw(self):
        # soll jetzt irgendwas tun
    
da die Klasse Weiter die Methode draw() von Hallo erbt, aber diese neu beschreibt, spricht man hier dan auch von überladen??

MfG cz3kit
Haben wir mal wieder was gelernt :P
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein, eigentlich spricht man besser von ueberschreiben, da die alten Methoden/Funktionen/etc nicht mehr verfuegbar sind.

Echtes Ueberladen findet man z.B in C++, da wird eine Funktion nicht nur anhand des Namens, sondern auch anhand der Typen bestimmt, die gibt es in Python Funktionsdefinitionen aber nicht.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

http://de.wikipedia.org/wiki/Überladen
http://de.wikipedia.org/wiki/Überschreiben

Stefan

PS: Was für eine doofe Forumssoftware - URLs bitte selbst zusammensetzen, ich fummel da jetzt kein URL-Tag rum, sondern schreibe lieber diesen Text, auch wenn das letztlich länger gedauert hat.
cz3kit
User
Beiträge: 74
Registriert: Freitag 9. Januar 2009, 16:24

Ah oke alles kla.
Ich habe hier noch so eine Definition von beidem eben gerade gefunden:

Überladen: Methoden in gleicher Klassemit unterschiedlichen Typen

Überschreiben: Methoden in unterschiedlichen Klassen(abgeleitete Klasse und Basisklasse/Schnittstelle) mit übereinstimmenden Typen.
Haben wir mal wieder was gelernt :P
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein, deine Definitionen sind falsch.

Das kommt nicht auf die Herkunft an, sondern, ob die Versionen nebeneinander existieren koennen.
cz3kit
User
Beiträge: 74
Registriert: Freitag 9. Januar 2009, 16:24

Hmm dan versteh ich das überhaupt nicht mehr, dem Wiki Text nach trifft die Definition auf einige Punkte des Überschreibens zu, außer der Text ist falsch, wer weiß

Hier mal die URL
http://de.wikipedia.org/wiki/%C3%9Cberschreiben
Haben wir mal wieder was gelernt :P
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dort steht etwas ganz anderes als deine Definition. Das, was dort steht, stimmt.

Zum Ueberschreiben braucht man in der Regel eine Basisklasse, allerdings macht das nicht das Ueberschreiben aus, sondern die Grundbedingung ist, dass eine Methode gleichen Namens schon existiert.

Code: Alles auswählen

class C:
    def ueberschrieben(self):
		pass
    def ueberschrieben(self):
		pass
Das z.B. ist auch Ueberschreiben.

Ueberladen gibt es wie gesagt nicht in Python deshalb hier 2 C++ Funktionen:

Code: Alles auswählen

int do_foo(int i){
    return (42 + i);
}
int do_foo(int i, char c){
	return (42 - 23);
}
Je nach uebergebenen Argumenten wird eine andere Funktion aufgerufen zum Ueberladen braucht man (in C++) allerdings keine Klasse.

Worauf ich hinauswill ist folgendes:
Im Python-Fall existieren die beiden Methoden nicht nebeneinander (auch nicht wenn man die Signatur aendern wuerde).
Im C++ Fall dagegen schon. (Ueberschreiben kann man da allerdings nur Methoden, da sonst sich sonst der Compiler wegen der ODR beschwert)
cz3kit
User
Beiträge: 74
Registriert: Freitag 9. Januar 2009, 16:24

Also wenn ich dein erstes Beispiel richtig verstehe wird erst eine Basisklasse benötigt in der eine MEthode vorhanden ist zB

Code: Alles auswählen

class Hallo():
    def __init__(self, string):
         self.string = string
    
    def gibZurueck(self):
        return self.string
So jetzt haben wir eine Zweite Klasse die von der ersten erbt

Code: Alles auswählen

class Was(Hallo):
    def __init__(self, string):
        Hallo.__init__(self, string)
    
    def gibZurueck(self)
        return (self.string + self.string)
also hääte ich die Methode gibZurueck überschrieben
Haben wir mal wieder was gelernt :P
BlackJack

@cz3kit: Und die `__init__()` hast Du auch überschrieben.
Antworten