2016-04-12 13 views
-1

Ich bin ziemlich Neuling bei C# und habe hier zu diesem Thema gesucht. Ich denke, ich vermisse etwas Grundlegendes, also entschuldige mich, wenn das eine dumme Frage ist.Downcasting - Grundlagen

Ich habe zwei Objekte FullAlbum und Album. FullAlbum erbt von Album. Ich versuche, ein Album-Objekt in ein FullAlbum-Objekt umzuwandeln, damit ich damit arbeiten kann. Ich dachte, das wäre so einfach wie 'Downcasting' von Album zu FullAlbum, aber ich kann es nicht zum Laufen bringen, ich bekomme einen Laufzeitfehler, der besagt, dass es nicht von einem zum anderen konvertieren kann.

Ich habe bereits ein Album-Objekt _Album, das beim Debuggen ausgefüllt wird. Ich versuche es dann;

Ich erwarte, dass dies alle Eigenschaften von _album zu FullAlbum kopiert. Verpasse ich den Punkt?

+1

Mögliche Duplikate von [C# Vererbung & Casting] (http://StackOverflow.com/questions/4453242/c-sharp-inheritance-casting) – Neolisk

+2

"* Ich erwarte, dass dies alle Eigenschaften kopiert es von _album zu FullAlbum. Verpasse ich den Punkt? * "Ja. Casting kopiert keine Eigenschaften, sondern ändert lediglich das Verständnis des Compilers darüber, welchen Datentyp eine Variable hat. –

+0

Ein Ansatz zur Lösung Ihres Problems wäre die Erstellung eines FullAlbum-Konstruktors, der einen Typus von Album, und dann setzen Sie alle Eigenschaften von FullAlbum, die Sie innerhalb des Konstruktors benötigen. Es gibt einige Lösungen [hier] (http://stackoverflow.com/questions/729527/is-it-possible-to-assign-a-base-class) -Objekt-zu-einer-abgeleiteten-Klasse-Referenz-mit-a), die dabei helfen kann .. – Mash

Antwort

0
FullAlbum _fullAlbum = new FullAlbum(); 
_fullAlbum = _album as FullAlbum; 

Dies macht nicht das, was Sie erwarten. Der Operator as sagt: "Wenn dieses Objekt tatsächlich ein FullAlbum ist, dann gib mir einen FullAlbum Pointer zurück, sonst null."

Sie sagen, dass Sie ein Album-Objekt in konvertieren möchten ein Fullalbum-Objekt "Sie können das nicht durch Magie, Sie müssen ein FullAlbum-Objekt erstellen und füllen.

Der 'as' -Operator ist nur für die Wiederherstellung der Tatsache, dass dies ist bereits ein FullAlbum-Objekt, das Sie ein Album haben Zeiger auf

+0

Ok - ich denke, das beantwortet, dass ich nicht versuche, das Richtige zu tun! Ich befülle einfach mein FullAlbum-Objekt. –

0

Sie können FullAlbum immer in Album umwandeln, d. H. Ein bestimmtes Objekt als generischen Typ behandeln. Ein anderer Weg ist nicht garantiert, um zu funktionieren. Es werden keine Eigenschaften kopiert, Sie geben lediglich an, wie das Programm Ihre Variable sehen soll (unter welchem ​​Winkel also).

EDIT: Es ist möglich, Album zu FullAlbum zu werfen und es zur Kompilierzeit arbeiten, aber zur Laufzeit wird es nur funktionieren, wenn FullAlbum tatsächlich in dieser Albumvariable gespeichert wurde. Andernfalls wird ein Laufzeitfehler ausgelöst.

Beispiel:

class A { } 

class B: A { } 

//this will work 
var A = new B(); 
var B = (B)A; 

//but not this 
var A = new A(); 
var B = (B)A; 
+0

Sie können zu einem bestimmten Typ umwandeln, es wird zur Laufzeit fehlschlagen, wenn es nicht der richtige Typ ist – pm100

+0

@ pm100: Okay, vielleicht war meine Formulierung nicht genau richtig. Jetzt behoben. – Neolisk