为什么有可能? :
BitmapSource i = Imaging.CreateBitmapSourceFromHBitmap(...);
我正在编写一些应用程序,我发现这一行并且我已经收到了支持,因为MSDN说BitmapSource是抽象类。
答案 0 :(得分:7)
BitmapSource
是一个抽象类,因此无法直接创建,但Imaging.CreateBitmapSourceFromHBitmap
会返回从继承的具体类BitmapSource
因此可以"演员"到BitmapSource
。
它有一个抽象的Animal
类,但有一个继承自它的具体Giraffe
类:
Animal a = new Animal(); // illegal
Animal a = Zoo.CreateAnimalFromName("Giraffe"); // valid - returns a Giraffe instance
答案 1 :(得分:2)
对Imaging.CreateBitmapSourceFromHBitmap
的调用返回一些继承自BitmapSource
的具体类。因此,此调用不会创建抽象类BitmapSource
的实例。你只是对此感到困惑。
为简化情况,这类似于
Animal an1 = DogFactory.createDog();
或到
Animal an2 = CatFactory.createCat();
如果我们假设Animal
是抽象类,而Cat
和Dog
是继承自Animal
的具体类。
答案 2 :(得分:1)
BitmapSource
是一个抽象类,但Imaging.CreateBitmapSourceFromHBitmap
创建一个具有类型为具体子类InteropBitmap
的对象,您可以在.NET reference source中看到它:
unsafe public static BitmapSource CreateBitmapSourceFromHBitmap(
IntPtr bitmap,
IntPtr palette,
Int32Rect sourceRect,
BitmapSizeOptions sizeOptions)
{
SecurityHelper.DemandUnmanagedCode();
// CR: [....] (1681459)
return CriticalCreateBitmapSourceFromHBitmap(bitmap, palette, sourceRect, sizeOptions, WICBitmapAlphaChannelOption.WICBitmapUseAlpha);
}
unsafe internal static BitmapSource CriticalCreateBitmapSourceFromHBitmap(
IntPtr bitmap,
IntPtr palette,
Int32Rect sourceRect,
BitmapSizeOptions sizeOptions,
WICBitmapAlphaChannelOption alphaOptions)
{
if (bitmap == IntPtr.Zero)
{
throw new ArgumentNullException("bitmap");
}
return new InteropBitmap(bitmap, palette, sourceRect, sizeOptions, alphaOptions); // use the critical version
}
您可以将InteropBitmap
分配给BitmapSource
类型变量,因为它是基类(直接与否),完全如下:
interface ISomeInterface { };
abstract class SomeBaseClass : ISomeInterfac { };
class SomeClass : SomeBaseClass { };
然后你可以:
ISomeInterface var1 = new SomeClass();
或:
SomeBaseClass var2 = new SomeClass();
最终你可以创建一些隐藏创建对象的工厂方法:
class SomeFactoryClass
{
public SomeBaseClass CreateObject() { return new SomeClass(); }
}
SomeBaseClass var3 = SomeFactoryClass.CreateObject();
正如上面的.NET参考源代码所示。