有个问题一直百思不得其解,抽象类的定义是不能被实例化的类,但是类似于Array这样的抽象类,虽然不能用new新建实例,却可以通过静态方法返回其实例,是否与抽象类定义相悖?
第二个问题是,ConstantExpression继承自抽象类Expression,Expression有一个具有2个参数的构造方法,但是ConstantExpression类没有构造方法,如果我们自己编写的这样的两个类,是不会通过编译的,但是为什么这两个类就可以存在呢?是因为他们是内建类就可以不受某些约束么?
谢谢各位大大指教!
第二个问题是,ConstantExpression继承自抽象类Expression,Expression有一个具有2个参数的构造方法,但是ConstantExpression类没有构造方法,如果我们自己编写的这样的两个类,是不会通过编译的,但是为什么这两个类就可以存在呢?是因为他们是内建类就可以不受某些约束么?
谢谢各位大大指教!
如Convert.ToString(1234)
2、不知道你指的是什么,如果我们自己创建这种类,可以编译通过啊: abstract class Expression
{
protected Expression()
{ } protected Expression(ExpressionType nodeType, Type type)
{ }
} abstract class ConstantExpression : Expression
{ }
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、可以通过编译,用私有构造函数就可以了。
-------------------
否 抽象类的定义是不能被实例化的类
第二个问题是,ConstantExpression继承自抽象类Expression,Expression有一个具有2个参数的构造方法,但是ConstantExpression类没有构造方法,如果我们自己编写的这样的两个类,是不会通过编译的,但是为什么这两个类就可以存在呢?是因为他们是内建类就可以不受某些约束么?
----------------------------------------------------
未通过编译是因为你没有给父类写无参的构造函数,而实际上 Expression 是有三个构造函数的,一个静态无参构造函数,一个非静态无参构造函数,另一个就是你看到的。
而ConstantExpression 也是有构造函数的,构造函数的参数是一个。 由于访问级别的原因,你没有看到它们而已。并不是因为它们是内建类,内建类与自己创建的约束是一样的
--------------------------------------
这个是从父类的角度出发
gomoku的回复是从子类的角度出发
{
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;
}
{
//
}
protected Expression()
{}
protected Expression(ExpressionType nodeType, Type type)
{
//
}
ConstantExpressioninternal ConstantExpression(object value)
{
this.value = value;
}