2011-08-25 23 views
5

1)爲什麼下面的代碼不同。爲什麼Java和C#在oops中有所不同?

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)當從一種語言遷移到另一個是什麼,我們需要確保平穩過渡的事情。

+5

究竟是什麼你的問題?代碼是不同的,因爲它不是相同的語言。這個答案不夠嗎? – RoflcoptrException

+0

這個問題和作業有什麼不同? – Filburt

+0

@Filburt:查看答案。這不是作業問題 –

回答

9

原因是在Java中,默認方法是virtual。在C#中,虛擬方法必須明確標記爲這樣。
下面的C#代碼等同於Java代碼 - 注意在基類和override使用virtual在派生類:

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在類Derived。這是你通常不想做的事情,因爲它會導致繼承問題。

使用您發佈的類,下面的代碼將輸出不同的東西,但它總是相同的實例:

Base b = new Derived(); 
b.foo(); // writes "base" 
((Derived)b).foo(); // writes "derived" 

我上面會輸出「導出」,在這兩種情況下提供固定的代碼。

7

由於您隱藏了方法,因此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."); 
    } 
} 
相關問題