【问题标题】:Why does Java and C# differ in oops?为什么 Java 和 C# 在 oops 上有所不同?
【发布时间】:2011-11-03 12:38:06
【问题描述】:

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) 当从一种语言迁移到另一种语言时,我们需要确保顺利过渡。

【问题讨论】:

  • 您的问题到底是什么?代码不同,因为它不是同一种语言。这个答案还不够吗?
  • 这个问题和家庭作业有什么不同?
  • @Filburt:查看答案。这不是作业问题
  • 显然Java有更多的糟糕!,它是更早开发的。这是您应该关心的任何呃哦!
  • @Filburt 你所要做的就是看看这个帅哥的个人资料——我不认为有 40 个问题和 130 个答案的人是学校里试图完成家庭作业的人——我认为这只是一个人谁的问题表达得很糟糕

标签: c# java oop


【解决方案1】:

原因是在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"

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

【讨论】:

    【解决方案2】:

    C# 代码编译时会出现警告,因为您在其中隐藏了方法。

    在 Java 中,类方法始终是虚拟的,而在 C# 中则不是,您必须将它们明确标记为“虚拟”。

    在 C# 中,您必须这样做:

    public class Base
    {
        public virtual void Foo()
        {
            Console.WriteLine ("Base");
        }
    }
    
    public class Derived : Base
    {
        public override void Foo()
        {
            Console.WriteLine ("Derived.");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 2010-10-07
      相关资源
      最近更新 更多