日期:2014-05-17  浏览次数:20876 次

关于NEW 关键字的疑惑,在线等~
NEW 的MSDN解释为“在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。 ”
那么假如父类A  子类B  父类有个方法test
那么既然隐藏了基类的成员 那就应该是子类新定义的TEST方法了 为什么在A a=new B();的时候调用的确是A类的TEST方法呢。另外  在客户端代码运行时调用该方法,CLR 查找对象的运行时类型,并调用虚方法的重写方法,如果没有重写方法,那么就调用父类的方法。我像问下CLR是怎么确定A a=new B(); 的a对象运行时类型到底是A还是B的。
------解决方案--------------------
此new非彼new。
一个是修饰方法的,一个是创建对象运算符。

A a=new B();
此时a是B类型的。
但是运行的时候可能改变,比如
A a = new B();
A a1 = new A();
a = a1;
此时a因为指向另一个对象,类型就变成A了。
所以
A a;表示,a这个变量可以是A或者A的派生类。
在具体某个瞬间,你才能谈论它是什么类型。
------解决方案--------------------
一个关键字在不同的上下文中有不同的含义,这样的例子很多,比如
using System;

using (SqlConnection con = new SqlConnection(...))
{
   ...
}
再比如
var query = from x in data where x == 1;

class A<T> where T : class
{

}
中的class和where
------解决方案--------------------
A a=new B();A是B的父类
这里是一种隐式转换,称为协变,所以调用的还是A的方法