C#的继承多态与Java中的不同
原创
©著作权归作者所有:来自51CTO博客作者sunzongbao2007的原创作品,请联系作者获取转载授权,否则将追究法律责任
============C#===========================
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";
}
}
================Java===========================
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
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
python多态继承
python继承
构造函数 多重继承 Python -
java中的继承与多态 java继承多态封装简单代码
星期二, 十一月 10, 2015 10:34:07 封装 继承 可以从一个简单的类继承出相对复杂高级的类 多态 可以动态的对对象进行调用,使对象之间变得相对独立。 一:类的封装性 1.看下面的案例、 ----1.1代码案例:package day09
java中的继承与多态 Java类的封装、继承、多态 父类 System 子类