创建抽象类的对象。怎么可能

时间:2014-04-21 21:36:43

标签: c# .net abstract-class

为什么有可能? :

BitmapSource i = Imaging.CreateBitmapSourceFromHBitmap(...);

我正在编写一些应用程序,我发现这一行并且我已经收到了支持,因为MSDN说BitmapSource是抽象类。

3 个答案:

答案 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参考源代码所示。