我们知道c#中的Array类是抽象的。
但是此类的静态CreateInstance方法返回Array类的对象。
怎么可能?
答案 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
是抽象基类型,Cat
和Dog
是从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();
}
}