Animal thisIsACat = new Cat (); - Это неявное преобразование? - PullRequest
2 голосов
/ 22 июня 2011

Данный пример:

Animal thisIsACat = new Cat();

Есть ли неявное преобразование из Cat в Animal?

Для уточнения:

Предположим:

class Animal
{

}

class Cat: Animal
{

}

Ответы [ 3 ]

9 голосов
/ 22 июня 2011

Это просто полиморфизм подтипа .

Обратите внимание, что это НЕОБХОДИМОЕ преобразование (оно определено в §6.1.6 спецификацией), но оно НЕ меняет ссылочный идентификаторобъект конвертируется.

3 голосов
/ 22 июня 2011

Там нет преобразования - ваш объект Cat и всегда будет Cat - только переменная указана как Animal, а не сам объект.

Конверсия - это когда вы берете объект Cat, что-то с ним делаете, и вдруг у вас появляется другой объект типа Animal. В этой ситуации не имеет смысла.

При работе со структурами преобразования имеют больше смысла. Integer 5 можно преобразовать в Decimal 5 м, и это два совершенно разных объекта.

код:

int i = 5;
decimal d = i;

будет неявным преобразованием, потому что 5 - это System.Int32, но оно преобразуется в 5m, что является System.Decimal, и это совершенно другой объект, чем оригинал.

0 голосов
/ 22 июня 2011

Я должен предположить, что Animal - это интерфейс (или абстрактный класс).Тип данных Cat должен реализовывать интерфейс Animal ... так что да, у вас есть неявное преобразование из new Cat() в Animal.Преобразование из Animal в Cat должно быть явным: например, (Cat)thisIsACat

Прочтите в ресурс о полиморфизме подтипа, и вы увидите: Origins. Понятие подтипирования в языках программирования восходит к1960-е годы;это было введено в производных Simula.Первые формальные трактовки подтипов были даны Джоном С. Рейнольдсом в 1980 г., который использовал теорию категорий для формализации неявных преобразований , и Лука Карделли (1985).есть 2 типа: животное и кот.Cat является подтипом Animal: преобразование типов, приведение типов и принуждение относятся к различным способам явного или неявного изменения объекта одного типа данных на другой

...