读书人

关于NEW 关键字的疑惑

发布时间: 2012-12-27 10:17:09 作者: rapoo

关于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的方法

读书人网 >C#

热点推荐