2011-08-25 9 views
5

1) Perché i seguenti codici differiscono.Perché Java e C# differiscono nell'opt?

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) Durante la migrazione da una lingua all'altra quali sono le cose che dobbiamo garantire per transizione.

+5

Che cosa è esattamente la tua domanda? Il codice è diverso perché non è la stessa lingua. Questa risposta non è abbastanza? – RoflcoptrException

+0

In che modo questa domanda differisce dai compiti a casa? – Filburt

+0

@Filburt: vedere le risposte. Questa è una domanda di compiti a casa –

risposta

9

Il motivo è che in Java, i metodi sono virtual per impostazione predefinita. In C#, i metodi virtuali devono essere esplicitamente contrassegnati come tali.
Il seguente codice C# è equivalente al codice Java - si noti l'uso del virtual nella classe base e override nella classe derivata:

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

Il codice C# che hai postato nasconde il metodo foo nella classe Derived. Questo è qualcosa che normalmente non vuoi fare, perché causerà problemi con l'ereditarietà.

Utilizzando le classi hai postato, il seguente codice di uscita cose diverse, anche se è sempre la stessa istanza:

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

Il codice fisso che ho fornito sopra uscita volontà "derivata" in entrambi i casi.

7

Il codice C# verrà compilato con gli avvisi, poiché si nascondono i metodi lì.

In Java, i metodi di classe sono sempre virtuali, mentre in C# non lo sono, e devi contrassegnarli esplicitamente come "virtuali".

In C#, dovrete fare questo:

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

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