Seite 1 von 1

Frage zu Überladen

Verfasst: Mittwoch 12. August 2009, 19:22
von cz3kit
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

Verfasst: Mittwoch 12. August 2009, 20:29
von cofi
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.

Verfasst: Mittwoch 12. August 2009, 21:05
von sma
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.

Verfasst: Donnerstag 13. August 2009, 15:23
von cz3kit
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.

Verfasst: Donnerstag 13. August 2009, 15:43
von cofi
Nein, deine Definitionen sind falsch.

Das kommt nicht auf die Herkunft an, sondern, ob die Versionen nebeneinander existieren koennen.

Verfasst: Donnerstag 13. August 2009, 18:57
von cz3kit
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

Verfasst: Donnerstag 13. August 2009, 19:17
von cofi
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)

Verfasst: Donnerstag 13. August 2009, 19:45
von cz3kit
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

Verfasst: Donnerstag 13. August 2009, 23:22
von BlackJack
@cz3kit: Und die `__init__()` hast Du auch überschrieben.