1)为什么以下代码不同.
C#:
- class Base
- {
- public void foo()
- {
- System.Console.WriteLine("base");
- }
- }
- class Derived : Base
- {
- static void Main(string[] args)
- {
- Base b = new Base();
- b.foo();
- b = new Derived();
- b.foo();
- }
- public new void foo()
- {
- System.Console.WriteLine("derived");
- }
- }
Java的:
- class Base {
- public void foo() {
- System.out.println("Base");
- }
- }
- class Derived extends Base {
- public void foo() {
- System.out.println("Derived");
- }
- public static void main(String []s) {
- Base b = new Base();
- b.foo();
- b = new Derived();
- b.foo();
- }
- }
2)当从一种语言迁移到另一种语言时,我们需要确保顺利过渡.
解决方法
原因是在Java中,默认情况下方法是虚拟的.在C#中,必须明确标记虚拟方法.
以下C#代码等同于Java代码 – 请注意在基类中使用virtual并在派生类中重写:
以下C#代码等同于Java代码 – 请注意在基类中使用virtual并在派生类中重写:
- class Base
- {
- public virtual void foo()
- {
- System.Console.WriteLine("base");
- }
- }
- class Derived
- : Base
- {
- static void Main(string[] args)
- {
- Base b = new Base();
- b.foo();
- b = new Derived();
- b.foo();
- }
- public override void foo()
- {
- System.Console.WriteLine("derived");
- }
- }
您发布的C#代码隐藏了Derived类中的方法foo.这是您通常不想做的事情,因为它会导致继承问题.
使用您发布的类,以下代码将输出不同的内容,尽管它始终是相同的实例:
- Base b = new Derived();
- b.foo(); // writes "base"
- ((Derived)b).foo(); // writes "derived"