【分享帖】C#的继承重写与Java的不同
本帖最后由 sunzongbao2007 于 2011-12-21 16:56:56 编辑
主要因为看见这个。
http://topic.csdn.net/u/20111221/15/85bd76b7-a915-4e74-b336-fa429ac5505e.html?seed=1611658486&r=77025425#r_77025425
为了广大从Java转到C#且初学C#的同学们更好的理解new virtual 和override,我把以前发的一个文章转过来。
这也是在我初学的时候花了好几天写的一份笔记,希望对大家有帮助。
占楼1 2 3
------最佳解决方案--------------------了解一下方法表
------其他解决方案--------------------
using System;
class B:A
{
public dynamic make(){
return "B";
}
public static void Main(){
A a=new B();
Console.WriteLine(a.make());
}
}
class A
{
public dynamic make(){
return "A";
}
}
class B extends A
{
public String make(){
return "B";
}
public static void main(String[] args){
A a=new B();
System.out.println(a.make());
}
}
class A
{
public String make(){
return "A";
}
}
------其他解决方案--------------------==============================================
这两个的结果让我蛋疼很久了
真相就在C#的三个关键字 virtual,new和override上
上面的C#例子是个果断的继承分裂
而在Java的任意基类中所有可继承的方法都看作虚函数,也就是自带C#中的virtual关键字
而派生子类呢,与基类中相同的方法全部Auto自带override关键字。
于是C#真正的多态应该是如下
==============================================
using System;
class B:A{
public override dynamic make(){
return "B";
}
public static void Main(){
A a = new B();
Console.WriteLine(a.make());
}
}
class A{
public virtual dynamic make(){
return "A";
}
}
这才是Java中的普遍继承现象。
这样也省的我把自己的Java思想覆盖了,因为有关键字约束。
new又是怎么回事呢?
可以这样解释:继承关系可以看作一条链,例如A:B,B:C(A继承B,B继承自C)
看作一条这样的链 C->B->A
假如三个类中都有相同函数 public void printText(){...}而关键字不同
C: public virtual void printText(){Console.WriteLine("C");}
B: public override void printText(){Console.WriteLine("B");}
A: public override void printText(){Console.WriteLine("A");}
现在如此实例化
C c=new A();
c.printText();//结果是A,这是正常现象(说是正常现象,是因为跟自己的Java知识不冲突)
而按照下面的函数声明(加入new)
C: public virtual void printText(){Console.WriteLine("C");}
B: public override void printText(){Console.WriteLine("B");}
A: public new void printText(){Console.WriteLine("A");}
也如上实例化并调用
C c=new A();
c.printText();//你能猜到答案是什么吗?
结果输出的是B
这样的结果我们可以如此理解
virtual override关键字结合能让继承“链化”,“链化”的继承状态下,上转符合正常继承结果,也是常用的方法。
而加入new关键字,是为了将这条链断开,此时上转是另一个情况:调用距离基类最近的“断点”前的类特性(例子中也就是B,因为继承链断成 C->B A。出现C B->A的话会调用C的printText())
如果继承时没有任何关键字(C#编译器会发出警告:需要new关键字,但是可通过编译)会默认每个子类有new关键字,也就是形成C B A这样的无链接继承。
================================================
也就是说……不写关键字不仅出现奇怪的现象,也会抹杀自己以前的知识- -
所以,关键字v5
------其他解决方案--------------------原帖地址 :
本文出自 “Haley笔记” 博客,请务必保留此出处http://haley.blog.51cto.com/2280460/409845