Hi Oskar, einfacher ist es, das allgemeing�ltige Basisobjekt (oder die Mutter aller Objekte) als Beispiel herzunehmen -> Object. Alle Objekte sind in .net vom Objekt "Object" abgeleitet.
Dim a As Object Dim b As String = "Hallo" a = b So. Nun ist an Stelle a immer noch ein String, nur der Compiler wei� nichts mehr davon. Im Speicher liegt nur eine Adresse, die wiederum auf ein Objekt irgendwo anders im Speicher verweist (und letzteres kann beliebig gro� und von beliebiger Natur sein). Du kannst jetzt, wegen dem Compiler, nur auf Eigenschaften und Methoden des Object-Objekts zugreifen.. So ist es mit Basisobjekten und auch mit den einzelnen Interfaces. Deswegen geht auch noch folgendes ohne Problem: Dim c As IComparable c = b Und so verh�lt es sich mit Deinem GraphicCircle-Objekt eben auch. Es macht sogar durchaus Sinn. Nehm an, Du hast ein Basisobjekt "Tier". Du vereinst alle wichtigen(gemeinsamen) Eigenschaften und Funktionen der Tiere und stellst fest, dass deine "Katze" aber eher feige reagiert und nicht viel mit "Cryptomphalus aspersus" (irgendeine Weinbergschnecke) oder der neurotischen Ameise gemein hat - also schreibst Du eine speziellere(von Tier abgeleitete Klasse), die Deine feige Katze genauer beschreibt. Die hat ein paar Eigenschaften mehr wie z.B. eine "Knurrfrequenz" oder noch wichtiger der "FeigheitsIndex" und der "Verw�hnFaktor" die nun wahrlich nicht jedes Tier braucht. Letztendlich bleibt es aber ein Tier - mit all seinen Eigenschaften und Besonderheiten und will/kann auch als solches Angesprochen werden. Tier = Katze ist daher und in Wirklichkeit auch kein Widerspruch. Andersrum (= ist als Zuweisung zu verstehen, deswegen gibt�s 2 Richtungen) macht es schon eher Probleme, da Katze = Tier eben nicht immer der Fall ist. Es gibt ja - wie wir schon durch unsern kleinen Exkurs ins Tierreich gelernt haben *g* - noch mehr davon. Deswegen musst Du als Programmierer wissen dass das besagte Tier eine Katze ist und dies dem Compiler mitteilen (damit der die Knurrfrequenz freigibt). Z.B. mit Ctype() oder DirectCast(). Du musst Dir dabei der Sache aber ganz sicher sein, sonst gibt�s eine InvalidCastException. "Warum" das alles so ist, kann ich Dir nicht beantworten. Im Speicher liegt ja eine Katze und nicht nur irgendein Tier. Eigentlich k�nnte der Computer ja nachschauen was Du die 2000 Zeilen Code zuvor getan hast(der Speicherinhalt selbst gibt meist nur wenig Aufschluss �ber sich selbst), diesen Code mit jeder neuen Zeile analysieren und dann erfreut feststellen, dass es nicht nur ein Tier sondern eine Katze ist und damit auch gestreichelt werden will... Vielleicht ein ander' Mal ;) Oder? - um mit einem kurzen Wort den gesamten Vortrag zunichte zu machen ;) Dim foo As Object = Wolfgang http://www.vbwelt.de/ > -----Urspr�ngliche Nachricht----- > Von: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] Im Auftrag von Oskar Vaia > Gesendet: Freitag, 19. Dezember 2003 07:57 > An: [EMAIL PROTECTED] > Betreff: [Vb.net] Basis- und Subklasse > > Hallo, > > ich befasse mich gerade mit einem Buch �ber VB.NET. > Darin steht: > > --- > "Das Objekt einer abgeleiteten Klasse ist immer gleichzeitig > auch ein Objekt seiner Basisklasse. > > Diese Aussage hat Konsequenzen. Denn damit kann ein > Subklassen-Objekt einer Variablen vom Typ der Basisklasse > zugewiesen werden: > > Dim gc As New GraphicCircle() > Dim meinKreis As Circle() > meinKreis = gc > > Der Code wird fehlerfrei kompiliert, weil beide Variablen auf > denselben Speicherbereich verweisen. Allerdings besteht dabei > die Einschr�nkung, dass ein GraphicCircle-Objekt dann nur als > Circle-Objekt betrachtet wird. Die ein GraphicCircle-Objekt > kennzeichnenden Methoden, die nicht in der Klasse Circle > definiert sind, stehen damit auch nicht zur Verf�gung." > --- > > Beim deklarieren einer Objektvariablen verweist diese dann ja > auf einen Speicherbereich. > Wenn ich nun die Subklasse "GraphicCircle" sowie die > Basisklasse "Circle" deklariere, dann werden diese wohl auf > zwei getrennte Speicherbereiche verweisen, oder? > Dann verstehe ich nicht, wieso durch > > meinKreis = gc > > die Einschr�nkung bestehen sollte, dass ein > GraphicCircle-Objekt dann nur als Circle-Objekt betrachtet > wird. Durch diese Operation verweise ich wohl auf den > Speicherbereich der Subklasse und da m�sste "gc" wohl immer > ein "GraphicCircle-Objekt" bleiben, oder? > > Kann mir da bitte jemand erkl�ren, was zum einen im Speicher > beim Deklarieren der beiden Klassen wirklich abl�uft und > wieso auf einmal ein "GraphicCircle-Objekt" als > "Circle-Objekt" betrachtet wird? > > Dank und Gr��e > > Oskar _______________________________________________ Vb.net mailing list [EMAIL PROTECTED] http://www.glengamoi.com/mailman/listinfo/vb.net
