[英]Why does Java and C# differ in oops?
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"
我在上面提供的固定代碼將在兩種情況下輸出“派生”。
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.");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.