c# - 为什么 Java 和 C# 在 oops 上不同?

标签 c# java oop

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中,方法默认是virtual。在 C# 中,虚拟方法必须显式标记。
以下 C# 代码等同于 Java 代码 - 请注意在基类中使用 virtual 并在派生类中使用 override:

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"

我上面提供的固定代码在这两种情况下都会输出“derived”。

关于c# - 为什么 Java 和 C# 在 oops 上不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7188133/

相关文章:

c# - 创建具有总 UTC 日的日期范围

c# - 自定义配置部分 : Could not load file or assembly

C# Newtonsoft 使用声明反序列化自定义对象?

java - 是否必须调用 AndroidThreeTen.init()?

java - 在设备之间建立蓝牙连接

java - 隐藏布局中的所有控件

python如何构造这个类

c# - jquery 中出现非法调用错误

.net - 多态泛型

php - oop模型基类设计: static and non-static data access