如何从抽象类创建对象?

时间:2012-01-14 13:39:10

标签: c# arrays abstract-class

我们知道c#中的Array类是抽象的。

但是此类的静态CreateInstance方法返回Array类的对象。

怎么可能?

6 个答案:

答案 0 :(得分:5)

描述

不,你不能创建一个抽象类的实例。

  

MSDN :抽象类与接口密切相关。 它们是无法实例化的类,并且经常要么部分实现,要么根本没有实现。抽象类和接口之间的一个关键区别是类可以实现无限数量的接口,但可以仅从一个抽象(或任何其他类)的类继承。从抽象类派生的类仍然可以实现接口。抽象类在创建组件时很有用,因为它们允许您在某些方法中指定不变的功能级别,但是在需要该类的特定实现之前,请保留其他方法的实现。它们的版本也很好,因为如果派生类需要额外的功能,它可以添加到基类而不会破坏代码。

更多信息

答案 1 :(得分:4)

这是一个返回数组实例的静态工厂方法。此示例为整数值类型创建长度为10的数组。

System.Array myIntArray = Array.CreateInstance(typeof(int),10);

这应该会为您提供更多详细信息http://msdn.microsoft.com/en-us/library/zb3cfh7k.aspx

答案 2 :(得分:1)

Array似乎是抽象类的特例。从我在Documentation中读到的内容,我建议Array创建和函数以某种方式在.NET Framework代码内部处理 - 最有可能广泛使用本机代码以获得更好的性能结果。我认为这就是为什么这个课程已被抽象化了。

如果有更多了解.NET Framework内部的人能够改进我的答案,我会很高兴。

答案 3 :(得分:1)

方法Array.CreateInstance()的各种重载被输入为返回Array,它确实是一个抽象类。但是它们返回的对象的类型不是直接Array,它是Array继承的某种类型(什么类型完全取决于使用的重载和传入的参数) )。

例如:

Array a = Array.CreateInstance(typeof(int), 10); //create some array
Type type = a.GetType(); // type is int[], which is not abstract
Type baseType = type.BaseType; // baseType is Array

基本上,它与以下工厂方法的原理相同:

abstract class Animal
{
    public static Animal CreateInstance(AnimalType animalType)
    {
        if (animalType == AnimalType.Cat)
            return new Cat();
        if (animalType == AnimalType.Dog)
            return new Dog();
        // etc.
    }
}

此处,Animal是抽象基类型,CatDog是从Animal继承的具体类型,animalType告诉我们哪种类型应该是方法返回。

现在,在.Net中以特殊方式处理数组(例如,有专门用于处理数组的IL指令)。但它们在类型系统中不是例外(可能是阵列协方差)。

答案 4 :(得分:0)

我认为与此情况相关的最佳方法是考虑一种返回接口实例的方法!!!

嗯,你知道我们可以创建一个接口的实例,但在内部方法可能知道实现该接口的类并返回该类的实例。

答案 5 :(得分:-1)

namespace ConsoleApplication1
{
    public class Circle : Shape
    {
        public override void Draw()
        {
            Console.WriteLine("Draw a Circle");
        }
    }

    public abstract class Shape
    {    
        public abstract void Draw();
    }
}

您可以这样做

class Program
{
    static void Main(string[] args)
    {       
        Shape v;
        v = new Circle();
        v.Draw();
    }
}