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/