我们知道C#中的Array类是抽象的。
但是,该类的静态CreateInstance方法会返回一个Array类对象。
这是如何实现的呢?
我们知道C#中的Array类是抽象的。
但是,该类的静态CreateInstance方法会返回一个Array类对象。
这是如何实现的呢?
不,您不能创建抽象类的实例。
MSDN:抽象类与接口密切相关。它们是无法实例化的类,通常是部分实现或根本未实现。抽象类和接口之间的一个关键区别是,类可以实现无限数量的接口,但只能继承一个抽象(或任何其他类型的)类。从抽象类派生的类仍然可以实现接口。在创建组件时,抽象类很有用,因为它们允许您在某些方法中指定不变的功能水平,但在需要该类的特定实现之前留下其他方法的实现。它们也很好地实现了版本控制,因为如果派生类中需要其他功能,则可以将其添加到基类而不会破坏代码。
这是一个静态工厂方法,用于返回一个数组实例。该示例创建了一个长度为10的整数值类型数组。
System.Array myIntArray = Array.CreateInstance(typeof(int),10);
这应该能为您提供更多详细信息 http://msdn.microsoft.com/en-us/library/zb3cfh7k.aspx
Array.CreateInstance()
有多个重载,它们的返回类型都被定义为Array
,实际上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
是一个抽象基类型,Cat
和Dog
是继承自Animal
的具体类型,animalType
告诉我们该方法应返回哪种类型。Array
似乎是抽象类的一个特例。从我在 文档 中所读到的,我建议 Array
的创建和函数在 .NET Framework 代码中被内部处理 - 很可能广泛使用本地代码以获得更好的性能结果。我认为这就是为什么这个类被设计成抽象的原因。
如果有更了解 .NET Framework 内部机制的人可以改进我的答案,我会很高兴。
我认为与这种情况相关的最佳方式是考虑一个返回接口实例的方法!!!
你知道,我们不能创建接口的实例,但是在内部,一个方法可能知道实现该接口的类,并返回该类的实例。
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();
}
}