有个问题一直百思不得其解,抽象类的定义是不能被实例化的类,但是类似于Array这样的抽象类,虽然不能用new新建实例,却可以通过静态方法返回其实例,是否与抽象类定义相悖?
    第二个问题是,ConstantExpression继承自抽象类Expression,Expression有一个具有2个参数的构造方法,但是ConstantExpression类没有构造方法,如果我们自己编写的这样的两个类,是不会通过编译的,但是为什么这两个类就可以存在呢?是因为他们是内建类就可以不受某些约束么?
    谢谢各位大大指教!

解决方案 »

  1.   

    这里ARRAY 等定义为static  就相当于函数一样用,
    如Convert.ToString(1234)
      

  2.   

    1、抽象类不能实例化是只不能通过new操作符进行实例化,使用静态方法而获取到的实例不在此限,至于这个静态方法内是如何实例化Array抽象类的实例的我们另议
    2、不知道你指的是什么,如果我们自己创建这种类,可以编译通过啊:        abstract class Expression
            {
                protected Expression()
                {            }            protected Expression(ExpressionType nodeType, Type type)
                {            }
            }        abstract class ConstantExpression : Expression
            { }
      

  3.   

    // ---- 1 ----
    public abstract class Manager
    {
        public Manager CreateSomeInstance() { return new DefaultManager(); }
    }
    public class DefaultManager : Manager
    {
    }// ---- 2 ----
    public class MyExpression
    {
        public MyExpression(string name, int op){}
    }
    public class MyConstantExpression : MyExpression
    {
        private MyConstantExpression() : base(null, 0) { }
    }1、抽象类的定义是不能被实例化,但是,这并不能阻止它有个静态方法返回某个对象。该对象是抽象类的派生类。
    2、可以通过编译,用私有构造函数就可以了。
      

  4.   

    是否与抽象类定义相悖
    -------------------
    否 抽象类的定义是不能被实例化的类
    第二个问题是,ConstantExpression继承自抽象类Expression,Expression有一个具有2个参数的构造方法,但是ConstantExpression类没有构造方法,如果我们自己编写的这样的两个类,是不会通过编译的,但是为什么这两个类就可以存在呢?是因为他们是内建类就可以不受某些约束么?
    ----------------------------------------------------
    未通过编译是因为你没有给父类写无参的构造函数,而实际上 Expression 是有三个构造函数的,一个静态无参构造函数,一个非静态无参构造函数,另一个就是你看到的。
    而ConstantExpression 也是有构造函数的,构造函数的参数是一个。 由于访问级别的原因,你没有看到它们而已。并不是因为它们是内建类,内建类与自己创建的约束是一样的
      

  5.   

    谢谢您的回答,第一个疑问解决了哈,但是第二个问题,如果Expression类只有一个具有两个参数的构造函数呢?
      

  6.   

    原来是因为有些我们看不到啊,谢谢,那疑问解决了,我本来以为Expression类只有一个具有两个参数的构造函数
      

  7.   

    未通过编译是因为你没有给父类写无参的构造函数
    --------------------------------------
    这个是从父类的角度出发
    gomoku的回复是从子类的角度出发
      

  8.   

    我刚才用reflector看了一下Expression类,它应该只有两个构造函数吧static Expression()
    {
        lambdaTypes = new Type[] { typeof(Expression), typeof(IEnumerable<ParameterExpression>) };
        funcTypes = new Type[] { typeof(Func<>), typeof(Func<,>), typeof(Func<,,>), typeof(Func<,,,>), typeof(Func<,,,,>) };
        actionTypes = new Type[] { typeof(Action), typeof(Action<>), typeof(Action<,>), typeof(Action<,,>), typeof(Action<,,,>) };
    }  protected Expression(ExpressionType nodeType, Type type)
    {
        this.nodeType = nodeType;
        this.type = type;
    } ConstantExpression是只有一个internal ConstantExpression(object value, Type type) : base(ExpressionType.Constant, type)
    {
        this.value = value;

      

  9.   

    你看的应该是3.54.0 里是这样的Expressionstatic Expression()
    {
          //
    }
    protected Expression()
    {} 
     protected Expression(ExpressionType nodeType, Type type)
    {
              //
    }
    ConstantExpressioninternal ConstantExpression(object value)
    {
        this.value = value;
    }