2013-07-27 21 views
5

Considerate questo codice:Perché non chiama il metodo genitore quando non usiamo il metodo hiding?

internal class Program 
    { 

     private static void Main(string[] args) 
     { 
      var student = new Student(); 
      student.ShowInfo(); //output --> "I am Student" 
     } 
    } 
    public class Person 
    { 
     public void ShowInfo() 
     { 
      Console.WriteLine("I am person"); 
     } 
    } 

    public class Student : Person 
    { 
     public void ShowInfo() 
     { 
      Console.WriteLine("I am Student"); 
     } 
    } 

nel codice di cui sopra non usiamo il metodo nascondersi.

quando si crea l'istanza dello studente e si chiama il metodo showinfo la mia uscita è I am Student non utilizzo la parola chiave new.

Perché non si chiama il metodo genitore quando non si utilizza il metodo hiding?

+0

Come conoscenza ci deve essere errore di ambiguità – Shaharyar

+0

Nessun errore –

+8

Per impostazione predefinita il metodo è nascosto anche se si utilizza 'new' o no –

risposta

14

Indipendentemente dal fatto che si stia utilizzando la parola chiave new o meno, il metodo di base non è virtuale. Quindi è sempre il metodo derivato che verrà chiamato. L'unica differenza è che il compilatore si emette un avviso perché il metodo di base è nascosto e non ha usato esplicitamente la parola chiave new:

'Student.ShowInfo()' nasconde ereditato membro 'Person.ShowInfo() '. Usa la nuova parola chiave se il nascondiglio era inteso.

Il compilatore C# sta emettendo questo messaggio per avvisarti che potresti averlo fatto per errore senza nemmeno accorgertene.

Al fine di risolvere l'avvertimento è necessario utilizzare la nuova parola chiave se questo nascondiglio è stato intenzionale:

public new void ShowInfo() 
{ 
    Console.WriteLine("I am Student"); 
} 

In caso contrario, si dovrebbe fare il metodo di base virtuale:

public class Person 
{ 
    public virtual void ShowInfo() 
    { 
     Console.WriteLine("I am person"); 
    } 
} 

e poi di override nella classe derivata:

public class Student : Person 
{ 
    public override void ShowInfo() 
    { 
     Console.WriteLine("I am Student"); 
    } 
} 

Ovviamente in entrambi i casi si ha la possibilità t o chiamare il metodo di base, se si desidera che:

public override void ShowInfo() 
{ 
    base.ShowInfo(); 
    Console.WriteLine("I am Student"); 
} 
3

Sta usando il metodo nascosto, è solo implicitamente utilizzato. La parola chiave new deve essere utilizzata per in modo esplicito. mostra che sai che stai nascondendo il metodo, tuttavia, il tuo codice continuerà a compilare e nascondere il metodo. Anche se questo è decisamente sconsigliato.

2

Student.ShowInfo() pelli ereditate membro Person.ShowInfo()

di controllare meglio gli avvertimenti del compilatore

'ConsoleApplication5.Program.Student.ShowInfo()' pelli ereditato membro 'ConsoleApplication5.Program.Person.ShowInfo() '. Utilizzare la nuova parola chiave se si desiderava nascondere.

2

Utilizzando lo stesso metodo, la firma ShowInfo significa che si intende nascondere il metodo delle classi genitore. La parola chiave new non è richiesta, ma consente allo sviluppatore di sapere che il metodo corrente nasconde un altro metodo nella classe padre.

2

Si tratta di nascondere che è il motivo per cui si ottiene un avvertimento dicendo che se si intende intenzionalmente per nasconderlo, è necessario utilizzare la parola chiave new. Controllare la sezione 3.7.1.2 dello C# Language SpecHiding through inheritance.

Il nome che si nasconde attraverso l'ereditarietà si verifica quando le classi o le strutture redeclare i nomi che sono stati ereditati dalle classi di base. Questo tipo di nome nascondere assume una delle seguenti forme:

• Un costante, campo, proprietà, evento o tipo introdotto in una classe o struct nasconde tutti i membri della classe base con lo stesso nome.

• Procedimento introdotto in una classe o struct nasconde tutti classe base non metodo membri con lo stesso nome, e tutti i metodi della classe base con lo stesso firma (nome del metodo e conteggio dei parametri, modificatori e tipi) .

• Un indicizzatore introdotto in una classe o struttura nasconde tutti gli indicizzatori della classe base con la stessa firma (conteggio e tipi di parametri).

3

In realtà, il nuovo modificatore non ha alcun effetto dal punto di vista della logica del programma.

L'solo effetto del nuovo modificatore ha è quello di documentare le vostre intenzioni in modo che:

  • il compilatore può segnalare se del caso (ad esempio, quando si utilizza il nuovo modificatore in una dichiarazione che non nasconde un membro ereditato - o il contrario, quando non si utilizza il nuovo modificatore, anche se la dichiarazione si nasconde un membro ereditato)

  • altri sviluppatori più facile capire il vostro codice di

Ciò che conta davvero nascondere/non nascondere è se si utilizza lo override modifier o meno (che è possibile utilizzare solo se il membro ereditato è virtuale). Se non si utilizza il modificatore di sovrascrittura, il membro ereditato è sempre nascosto.Nel tuo esempio non utilizzi il modificatore di override, quindi fai do nascondi il membro ereditato.

Nota: Non confondere il 'new modifier' with the 'new operator' or the 'new constraint'

1

Come altri hanno detto method hiding is implicit se si è utilizzato new parola chiave o meno. È possibile controllare con questo pezzo di codice -

 private static void Main(string[] args) 
    { 
     Person student = new Student(); 
     student.ShowInfo(); //output --> "I am person" 
    } 

Quando si instantiate base class object with derived class, il vostro derived method won't get called.

Problemi correlati