2013-01-16 12 views
7

Powiel możliwe:
Is there a ‘new’ modifier for methods in Java?Czy istnieje odpowiednik Javy dla "nowego" modyfikatora w C#?

w C#, metoda podklasy mogą być modified as new.

Jedno użycie nowego modyfikatora, aby jawnie ukryć element odziedziczony po klasie bazowej.

Czy w języku Java występuje to samo słowo kluczowe?

+5

Krótka odpowiedź: nr –

+2

Prawdopodobnie tego użycia 'nowego' należy unikać w języku C#. Może lepiej przeprojektować? – horgh

Odpowiedz

4

nr

W języku C# używać New ukryć/shadow zakaz wirtualne funkcje klasy bazowej. Potrzebujesz tego słowa kluczowego w języku C#, ponieważ nie możesz przesłonić funkcji, które nie są wirtualne.

W języku Java wszystkie funkcje są domyślnie wirtualne, dlatego zawsze można je zastąpić i nie ma potrzeby stosowania słowa kluczowego, takiego jak nowy.

Mam nadzieję, że to pomoże.

+1

(A następnie ktoś idzie i tworzy metodę 'final' ..) –

2

W języku C# dowolna metoda, którą chcesz zastąpić z baseclase, musi być abstract, virtual lub sama override. Nowe słowo kluczowe faktycznie nie zastępuje. Działa to trochę inaczej:

Jeśli zadeklarujesz funkcję z nowym słowem kluczowym, ukrywając funkcję klasy podstawowej, THIS implementacja będzie używana tylko wtedy, gdy masz obiekt tego samego typu podrzędnego. Przykład:

class TopClass 
    { 
     public String getHello() 
     { 
      return "Hello"; 
     } 

     public virtual String getWorld() 
     { 
      return "World"; 
     } 
    } 

    class ChildClass : TopClass 
    { 
     public new String getHello() 
     { 
      return "Hi"; 
     } 

     public override string getWorld() 
     { 
      return "Earth"; 
     } 
    } 

To spowoduje:

 TopClass tc = new TopClass(); 
     Console.WriteLine(tc.getHello() + " " + tc.getWorld()); // Hello World 

     ChildClass cc = new ChildClass(); 
     Console.WriteLine(cc.getHello() + " " + cc.getWorld()); // Hi Earth 

     TopClass tc2 = new ChildClass(); 
     Console.WriteLine(tc2.getHello() + " " + tc2.getWorld()); // Hello Earth 

     Console.ReadLine(); 

Widać różnicę nowego hasła w porównaniu do typowej ręczne: Jeśli klasa rozszerzenie jest odlewano do rodziców ClassType nadrzędnym funkcje (return Earth zamiast World) będą nadal działać, podczas gdy nowe funkcje nie są (Hi nie jest zwracane zamiast Hello).

+0

+1 dla przykładów. Dobrze wiedzieć o metodach klasy bazowej używanych przy rzutowaniu na typ ogólny (klasa górna). – Destrictor