多态的问题
B b = new B();A a = b;
a.F();
A a=b实际上a还是批向了b对象,a.F()怎么会去调动用A里的F这个方法呢?
求指点。。
--------------------编程问答-------------------- 因为 new
class A
{
public void F() { Console.WriteLine("A.F"); }
}
class B : A
{
new public void F() { Console.WriteLine("B.F"); }
}
class Program
{
static void Main(string[] args)
{
B b = new B();
A a = b;
a.F();
}
话说有必要老是玩这个梗吗?
出题的人真无聊。 --------------------编程问答-------------------- http://msdn.microsoft.com/zh-cn/library/vstudio/51y09td4.aspx
new 运算符
用于创建对象和调用构造函数。
new 修饰符
用于向基类成员隐藏继承成员。
我不继承父的东西,我要自己搞(还有其他方式实现多态;virtual override)
http://msdn.microsoft.com/zh-cn/library/ebca9ah3(v=vs.90).aspx
new 约束
用于在泛型声明中约束可能用作类型参数的参数的类型。 --------------------编程问答-------------------- 父类跟子类的方法都要执行一次吧? --------------------编程问答-------------------- B b = new B();
A a = b;
a.F();
亏好A中有一个F(),否则这代码根本就编译不过去。也就是说无论如何都不会执行B.F();不信你把A的F删除了试试看。
判断一个教C#的老师是否有资格站在讲台上的一个典型办法就是,如果一个老师把new(方法隐藏)拿来和继承、覆盖一起讲,就说明这个货只是一个做题的主,根本没有写过程序,更不配当老师。
方法隐藏是一种极其罕见的语法,罕见到你有机会动用公交车上的逃生铁锤也未必有机会在实际开发中使用一回。 --------------------编程问答-------------------- 如果一个方法没有被修饰成virtual,(其实是省略了sealed修饰)那么它就不允许被重写。
好比如果一个变量没有加上protected或者public(其实是省略了private修饰),那么你就不能在派生类中访问一样。
但是好在当老师的基本还没有愚蠢到在课堂上大谈特谈如何在一个派生类中非要访问基类的私有成员。但是他们的头脑的智慧也就大多止步于此了。 --------------------编程问答--------------------
new public void F() { Console.WriteLine("B.F"); }
1 2 楼 都说了 --------------------编程问答-------------------- 你这个根本就不存在什么多态,只是对方法的重写(overwrite)。
我也觉得真无聊。 --------------------编程问答--------------------