C# 为什么Java和C在oops方面有所不同?

C# 为什么Java和C在oops方面有所不同?,c#,java,oop,C#,Java,Oop,1) 为什么以下代码不同 C#: 类基 { 公共图书馆 { System.Console.WriteLine(“基本”); } } 派生类:基 { 静态void Main(字符串[]参数) { 基b=新基(); b、 foo(); b=新派生的(); b、 foo(); } 公众新富() { System.Console.WriteLine(“派生”); } } 爪哇: 类基{ 公共图书馆{ System.out.println(“基”); } } 类派生的扩展基{ 公共图书馆{ Syst

1) 为什么以下代码不同

C#:

类基
{
公共图书馆
{
System.Console.WriteLine(“基本”);
}
}
派生类:基
{
静态void Main(字符串[]参数)
{
基b=新基();
b、 foo();
b=新派生的();
b、 foo();
}
公众新富()
{
System.Console.WriteLine(“派生”);
}
}
爪哇:

类基{
公共图书馆{
System.out.println(“基”);
}  
}
类派生的扩展基{
公共图书馆{
System.out.println(“派生”);
}
公共静态void main(字符串[]s){
基b=新基();
b、 foo();
b=新派生的();
b、 foo();
}
}

2) 当从一种语言迁移到另一种语言时,我们需要确保平稳过渡。原因是在Java中,默认情况下方法是虚拟的。在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代码隐藏了类
派生的
中的方法
foo
。这是您通常不想做的事情,因为它会导致继承问题

使用您发布的类,以下代码将输出不同的内容,尽管它始终是同一个实例:

Base b = new Derived();
b.foo(); // writes "base"
((Derived)b).foo(); // writes "derived"
我上面提供的固定代码在这两种情况下都将输出“派生的”。

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.");
    }
}

你的问题到底是什么?代码是不同的,因为它不是相同的语言。这个答案还不够吗?这个问题和家庭作业有什么不同?@Filburt:看看答案。这不是家庭作业问题显然Java有更多面向对象的功能!,它是较早开发的。这是任何的哦!你应该关心。@Filburt,你所要做的就是看看这个家伙的个人资料——我不认为一个有40个问题和130个答案的人是学校里试图完成家庭作业的人——我认为这只是一个措辞糟糕的人