[linux-l] virtual class (was: C++ - <vector> ...)

Oliver Bandel oliver at first.in-berlin.de
Do Jun 2 20:09:44 CEST 2005


Moin,


On Thu, Jun 02, 2005 at 05:51:14PM +0200, Axel Wei wrote:
> Am Donnerstag, 2. Juni 2005 16:20 schrieb Oliver Bandel:
> > Wenn ich eine Methode überschreiben will, in Objective-C, dann
> > schreibe ich eben in der abgeleiteten Klasse eine Methode, die den
> > selben Namen trägt, wie die Methode der Klasse, von der abgeleitet
> > wird.
> > Und wenn man das Original noch haben will, kann man da auch drauf
> > zugreifen (keyword "super" schickt ne Message dann an die
> > entsprechende Methode der Parent-Class).
> >
> > Was soll das keyword "virtuell" machen? Ist es die Umkehrung von
> > Objective-C's "super"?
> >
> > Deknen die beiden Sprachen in umgekehrter Richtung?
> 
> Ich kenne Objective-C (noch) nicht, darum kann ich diese Frage nicht 
> beantworten.
> 
> Es gibt aber einen entscheidenden Unterschied zwischen 'eine Methode 
> überschreiben' und 'eine virtuelle Methode (re)implementieren'. Ein 
> Beispiel:
> 
> class A{
> public:
> 	virtual void f();
> 	void g();
> };
> 
> class B: public A{
> public:
> 	void f();
> 	void g();
> };
> 
> A a;
> B b;
> A &c = b;
> 
> a.f()	ruft A::f()
> a.g()	ruft A::g()
> b.f()	ruft B::f()
> b.g()	ruft B::g()
> c.f()	ruft B::g() <-
> g.g()	ruft A::g() <-
> 
> Wie sagt man dieses Beispiel in Objective-C?

Weiß nicht.

Müsste man vermutlich selbst zusammen bauen.
mit super kann man eine Message an drüber liegende Klasse
bzw. Objekte der selbigen senden.
Von aussen geht das vermutlich nicht so, wie oben dargestellt.

Bin aber so tief nicht drin in Obj-C.

In Ocaml geht sowas wohl, auch wenn da "virtual" ein bischen
was anderes als in C++ ist.


Ach so, da fällt mir ein... man kann ja in Obj-C abfragen, 
ob ein Objekt zu einer bestimmten Klasse gehört, oder ob es 
eine bestimmte Methode anbietet und anderes Zeugs.
Also, bei der Frage nach "Is the object a member of <class-object>
or a descendant" kann man dann zumindest heraus bekommen, wo
die message eingetroffen ist. Darauf basierend kann man dann
ggf. die Message forwarden an Obj. einer anderen Klasse
(nach oben mit super). Das geht dann mit @selector.
Ist aber ein bischen was anderes, als was Du da oben meintest.
Habe ich mir auch noch nicht so genau angeschaut. Details
dazu müssen hier also noch auf sich warten lassen.


Was Objective-C angeht, ist das wohl nicht nur late binding,
sondern auch sog. dynamic binding. Also zur Laufzeit...
...deswegen ist das so flexibel.

Hat aber halt auch andere Nachteile. Was die Programmiersicherheit
angeht ist man ja mit compilierzeit-Prüfungen am sichersten (OCaml).
Objective-C ist da am flexibelsten, aber dann stellt man u.U. erst
zur Laufzeit fest, daß eine bestimmte Methode garnicht implementiert
ist. (Naja, "bitte kaufen Sie das Modul soundso nach" und dann lädt man es
zur Laufzeit ein... ist ja auch nicht schlecht. ;-))

C++ scheint da irgendwo zwischen drin zu sein.


Ein bischen seltsam finde ich es aber schon, daß obiges machbar ist.
Umgeht man damit nicht eigentlich die Daten-Kapselung?!

Ciao,
   Oliver



Mehr Informationen über die Mailingliste linux-l