amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > wie programmiert man "vererbung" [ - Suche - Neue Beiträge - Registrieren - Login - ]

1 -2- [ - Beitrag schreiben - ]

23.12.2010, 07:27 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Ok. Ein Beispiel aus der Praxis: der Imagebutton soll sich ein anderes Image darstellen wenn er gedrückt ist. Der Image-Teil des Imagebuttons weis aber nix von der maus und den coordinaten des Button-Teils. oder?
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 23.12.2010 um 07:27 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

23.12.2010, 10:43 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Wieso sollte er das nicht wissen?

Du solltest eher in C denken als in Assembler, das ist eigentlich nicht gut für OOP geeignet. Die Unterklasse erweitert ja einfach nur den Struct. Warum sollte sie nicht auf die geerbten Felder zugreifen können?
--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

23.12.2010, 10:59 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

heisst das die subklasse muss den struct der superklasse beim kompilieren kennen?
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

23.12.2010, 11:58 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Ja, natürlich. Man kann nichts subclassen, was man nicht kennt, was wäre sonst der Sinn davon? Dann wären es zwei getrennte Klassen.

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

23.12.2010, 12:02 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Ich hatte eine Idee wie es vielleicht doch geht, nämlich zB indem die subklasse die werte der superklasse per einer funtkion wie GetSuperAttr() oder änliches her holt! ;)
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

23.12.2010, 12:07 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Nein, so macht man das nicht.

Das ist sogar eine ganz schlechte Idee, denn die Funktionen der Ober-Klasse müssen selbstverständlich mit den aktuellen Daten arbeiten.

Merke: Redundanz (z.b. Daten an zwei verschiedenen Stellen speichern) = ganz, ganz schlechte Idee.

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

23.12.2010, 13:27 Uhr

tboeckel
Posts: 124
Nutzer
@AGSzabo:

Warum versuchst du eigentlich mit aller Macht ein eigenes OOP-System auf die Beine zu stellen, obwohl du doch nun schon sehr ausführlich demonstriert hast, daß dir das Verständnis für die Grundlagen fehlt. Es macht wenig Sinn mit fehlendem Verständis für die Natur das Rades zu versuchen eben dieses Rad neu zu erfinden, nur weil man meint das eigene wäre runder als die anderen.

Warum nimmst du nicht einfach das funktionierende BOOPSI-System und leitest deine Klassen von rootclass ab. Damit bekommst du auf jeden Fall schon mal ein funktionierendes Grundsystem plus Notifications geschenkt.

Wenn dir BOOPSI nicht gefällt oder nicht nutzbar ist, dann solltest du aber auch mal nachvollziehbare Gründe anführen warum genau du BOOPSI nicht verwenden kannst/willst. Oder geht es einfach wieder nur um deine übliche "mit dem Kopf durch die Wand und ich mache alles selbst und besser als alle anderen" Mentalität? Dann hast du definitiv ein größeres Problem...

Generell wäre was die Verwaltung der Instanzdaten angeht auch mal ein Blick in intuition/classes.h angeraten. Da steht mehr oder weniger ausführlich drin (man muß halt etwas nachdenken!), wie die Instanzdaten der einzelnen Objekte in Bezug auf ihre Klassen- und Subklassenabstammung verwaltet werden. Es braucht auf jeden Fall keine Klasse die Struktur der Instanzdaten der Mutterklasse zu kennen. Zum Abfragen und Manipulieren von Attributen (auch der übergeordneten Klassen) gibt es Get/SetAttrs() und DoSuperMethod(). Damit ist dann alles gekapselt und kann auch beliebig durch Subclassing erweitert und ersetzt werden.

[ - Antworten - Zitieren - Direktlink - ]

23.12.2010, 18:18 Uhr

Thore
Posts: 2266
Nutzer
Da er in Assembler programmiert, gibt es ja kein echtes OOP.
Aber wer so ein GUI System bauen will braucht Verständnis für Klassen, Subklassen und Event-, bzw Messagehandling.
Deshalb sagte ich mal an anderer Stelle, einmal die RKMs durchackern und dann die Fragen stellen :)
In so einem Projekt lernst du es, aber versuch mal selbst Dinge so rauszufinden. Als ich programmieren gelernt hab, gabs noch kein Internet für die Masse, da musste man sich anderweitig helfen :)

Viel Glück und Erfolg für Dein Projekt.

[ - Antworten - Zitieren - Direktlink - ]

23.12.2010, 22:12 Uhr

AGSzabo
Posts: 1663
Nutzer
Danke an alle und frohe Weihnachten! :-)
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 23.12.2010 um 22:13 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

29.12.2010, 14:51 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
Eine Klasse gibt es nicht in Form von Daten. Es ist nur eine Definition in Gedanken, die nach dem Kompilieren nicht mehr existiert, genauso wie Structs oder Variablen.

Zitat:
Original von Der_Wanderer:
Genauso kannst du doch auf die Funktion Pointer zugreifen, was hindert dich daran?
Normalerweise mit einem offset, z.b.

JSR DRAW_METHOD_PTR(a0)

Wobei a0 den Objekt Pointer enthält, und DRAW_METHD_PTR der offset ist.

Hier will ich doch mal einhaken und darauf hinweisen, dass Du ein OOP-System propagierst, dass so in der Praxis ziemlich unüblich ist. Typischerweise haben alle Instanzen einer Klasse dieselben Methoden, weshalb es eine ziemliche Speicherverschendung wäre, deren Funktionspointer in jeder Instanz vorzuhalten.

Deshalb gibt es, sofern man späte Bindung verwendet, zur Laufzeit sehr wohl eine Klasse in der Form von Daten, die mindestens die Funktionstabelle enthält. Diese enthält auch alle Funktionen der Superklasse, die allerdings auf andere Implementierungen zeigen können. Deshalb benötigt die Klasse auch einen Zeiger auf die Superklasse, falls eine Implementierung explizit die Funktion der Superklasse aufrufen will.

Wenn man allerdings keine späte Bindung verwenden will, braucht man überhaupt keine Funktionspointer oder IDs, sondern kann die Methoden wie ganz normale Unterprogramme direkt aufrufen.
Zitat:
Original von AGSzabo:
Ich hatte eine Idee wie es vielleicht doch geht, nämlich zB indem die subklasse die werte der superklasse per einer funtkion wie GetSuperAttr() oder änliches her holt! ;)

Kann man machen, hat allerdings ziemlich geringe Vorteile. Die Klasse muss ja trotzdem wissen, dass die Superklasse dieses Attribut besitzt.
Zitat:
Original von tboeckel:
Warum nimmst du nicht einfach das funktionierende BOOPSI-System und leitest deine Klassen von rootclass ab. Damit bekommst du auf jeden Fall schon mal ein funktionierendes Grundsystem plus Notifications geschenkt.

BOOPSI zu benutzen setzt mindestens genausoviel Verständnis von OOP voraus. Es zu verstehen, bevor man probiert, sein eigenes System zu implementieren, kann allerdings wirklich von Vorteil sein.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

29.12.2010, 22:09 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@Holger
Du hast natürlich, wie so oft, Recht, man kann die Pointer auch in der Klasse speichern, wenn man dafür eine Instanz anlegt. Bei vielen und kleinen Objekten ist das wesentlich effizienter, wenn auch etwas aufwendiger.

Bei NTUI habe ich das nicht gemacht, da es wenige Methoden sind und der overhead nicht so gross. Dafür spart man sich den Aufwand, die Klasse zu verwalten, und kann leichter "von aussen" in non-OOP Style Methoden subclassen, ähnlich wie SetFunction() für Libraries.

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

30.12.2010, 20:49 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

> Deshalb gibt es, sofern man späte Bindung verwendet, zur Laufzeit sehr wohl eine Klasse in der Form von Daten, die mindestens die Funktionstabelle enthält. Diese enthält auch alle Funktionen der Superklasse, die allerdings auf andere Implementierungen zeigen können. Deshalb benötigt die Klasse auch einen Zeiger auf die Superklasse, falls eine Implementierung explizit die Funktion der Superklasse aufrufen will.

Das ist genau die art von inside infos die ich möchte. danke
Bei mir können Klassen zB auch ihr eigenen konfigurationsdaten halten. es gibt auch einen speziellen funktionspointer mittels dem sich ein beispiel gadget(s) zur demonstration im ox-info programm anlegen lässt. außerdem haben klassen ihnenen eigene initialisierungsroutinen.
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 30.12.2010 um 20:50 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

04.01.2011, 16:14 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
Bei NTUI habe ich das nicht gemacht, da es wenige Methoden sind und der overhead nicht so gross. Dafür spart man sich den Aufwand, die Klasse zu verwalten, und kann leichter "von aussen" in non-OOP Style Methoden subclassen, ähnlich wie SetFunction() für Libraries.

Du musst dann ja jede einzelne Instanz patchen, wenn Du eine Funktion in einer Subklasse überschreiben will. Und wenn die neue Funktion die ursprüngliche aufrufen will (super-call), musst Du für den Funktionspointer extra Platz in der Instanz reservieren. Ob das wirklich einfacher ist?

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]


1 -2- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > wie programmiert man "vererbung" [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.