2014-11-17 3 views
0

Я читал на C# Image class. Этот класс является абстрактным. Поскольку я являюсь абстрактным классом, я не могу сделать объект из него, но он имеет метод Image.FromFile(string path);, который возвращает объект Bitmap. Теперь в коде Image img = Image.FromFile(path) работает, но Bitmap img = Image.FromFile(path) нет. Однако Bitmap img = (Bitmap) Image.FromFile(path) действительно работает!C# Изображение/растровый суперкласс/подкласс Кастинг аномалии

Мой вопрос заключается в следующем: зачем мне явное приведение в растровое изображение, если тип возвращаемого метода - битмап? Что происходит?

Чтобы уточнить: Я знаю, что документы MSDN говорят, что метод возвращает изображение. Когда я использую контрольную точку для проверки, изображение имеет растровое изображение. Даже если бы он имел изображение, это было бы еще более запутанным для меня, так как изображение абстрактно, поэтому я не могу иметь объект изображения, нет? Я пропустил что-то очевидное здесь?

+0

Потому что он возвращает «изображение» не «битмап» –

+0

@Ben Robinson. Но если я использую контрольную точку для проверки, это битмап. Изображение абстрактно, и если оно вернет изображение, я бы тогда не имел объект изображения, которого я не могу, потому что он абстрактный? – Comorbid

+0

Приятно объяснено здесь http://stackoverflow.com/questions/5571767/image-class-and-constructor-of-bitmap-type – Laky

ответ

0

Тип возвращение Image.FromFile является неBitmap, это Image(MSDN Docs).

public static Image FromFile(
    string filename, 
    bool useEmbeddedColorManagement 
) 

Так что вам нужен явный бросок, чтобы получить нужный тип.


Редактировать. Bitmap наследуется от Image и определяется как public sealed class Bitmap : Image. Хотя, когда вы проверяете объект, возвращаемый с FromFile, вы видите базовый тип в виде растрового изображения, этот метод предназначен для работы над «суперклассом» Image, так что это то, что он рассматривает как объект. Это позволяет использовать другие типы, которые также наследуются от Image, чтобы использовать этот метод. Классический полиморфизм при работе ...

+0

Но когда я использую точку останова для проверки того, что находится в объекте Image, это растровое изображение, и оно должно быть, потому что изображение является абстрактным, поэтому я не могу иметь объект изображения. Я что-то упустил? – Comorbid

+0

И да, извините, явный неявный. – Comorbid

+0

@Comorbid Ты почти там. «Bitmap» наследуется от «Image» - это также разъясняется в MSDN. Функция возвращает 'Image', но поскольку' Image' является абстрактным, фактический тип * должен * быть чем-то, наследующим от «Image» - в этом случае «Bitmap». Edit: Давайте попробуем быть более четкими, так как вы уже понимаете этот бит. Тип возврата - «Изображение», но фактический тип реализации - «Bitmap». –

Смежные вопросы