2016-04-12 2 views
-1

Я довольно новичок на C# и искал эту тему здесь. Я думаю, что мне не хватает чего-то фундаментального, поэтому приношу извинения, если это глупый вопрос.Downcasting - Основы

У меня есть два объекта FullAlbum и Album. FullAlbum наследуется от альбома. Я пытаюсь превратить объект Album в объект FullAlbum, чтобы я мог работать с ним. Я думал, что это было так же просто, как «Downcasting» от альбома до FullAlbum, но я не могу заставить его работать, я получаю ошибку времени выполнения, которая говорит, что он не может конвертировать из одного в другой.

У меня уже есть объект Album Album, который заполняется при отладке. Я тогда пытаюсь;

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

Я ожидаю, что это скопирует все свойства из альбома в FullAlbum. Я пропустил пункт?

+1

Возможный дубликат [C# Inheritance & Casting] (http://stackoverflow.com/questions/4453242/c-sharp-inheritance-casting) – Neolisk

+2

"* Я ожидаю, что это скопирует все свойства es от _album до FullAlbum. Мне не хватает точки? * «Да. Кастинг не копирует никаких свойств, он просто меняет понимание компилятором того, какой тип данных имеет переменная. –

+0

Одним из подходов к решению проблемы является создание конструктора FullAlbum, который принимает тип Альбом, а затем установить любые свойства в FullAlbum, которые вам нужны внутри конструктора. Существуют некоторые решения [здесь] (http://stackoverflow.com/questions/729527/is-it-possible-to-assign-a-base-class -объект-к-производному-классу-reference-with-a), который может помочь в этом. – Mash

ответ

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

Это не делать то, что вы ожидаете. Оператор as говорит: «Если этот объект на самом деле является FullAlbum, тогда верните мне указатель FullAlbum к нему, иначе верните null». Это не операция копирования или преобразования.

Вы говорите, что хотите «конвертировать объект альбома в объект fullalbum «Вы не можете сделать это по волшебству, вам нужно создать объект FullAlbum и заполнить его.

Оператор« как »предназначен только для восстановления того факта, что это действительно уже объект FullAlbum, который у вас есть Album указатель на.

+0

Хорошо - я думаю, это отвечает, что я не пытаюсь поступать правильно! Я просто «заполню» свой объект FullAlbum. –

0

Вы всегда можете отличить FullAlbum к альбому, т. Е. Относиться к определенному объекту как к более универсальному типу. Другой способ не гарантированно работает. Никакие свойства не скопированы, вы просто указываете, как вы хотите, чтобы программа смотрела на вашу переменную (под тем углом, который так сказать).

EDIT: Можно отдать альбом в FullAlbum и заставить его работать во время компиляции, однако во время выполнения он будет работать, только если FullAlbum был фактически сохранен в этой переменной Album. В противном случае это вызовет ошибку времени выполнения.

Пример:

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

вы можете применить к более конкретному типу, он не будет работать во время выполнения, если это не правильный тип – pm100

+0

@ pm100: Хорошо, возможно, моя формулировка не совсем правильная. Теперь исправлено. – Neolisk