2011-09-02 16 views
5

Ho una domanda teorica/pratica su come funziona l'ereditarietà in C#.Informazioni su C# ed Eredità

Diciamo che devo modellare alcune macchine, quindi ho alcuni metodi comuni che tutte le macchine devono implementare e un pilota dovrebbe sapere. In parole in codice questo dovrebbe essere un interfaccia:

interface Automobile { 
    void speedup(); 
    void break(); 
    void steer(); 
    //bla bla 
} 

Ora, tutti i tipi di auto dovrebbe avere alcune implementazioni tecniche comuni accanto alle azioni che un pilota in grado di eseguire su di loro, diciamo che il fuelLevel proprietà, a questo punto ancora non voglio sapere come una macchina accelera o si rompe, così mi ha scritto:

abstract class Car : Automobile { 
    int fuelLevel; // for example.... 
    public abstract void speedup(); 
    public abstract void break(); 
    public abstract void steer(); 
} 

Ora voglio modellare una Ferrari, quindi:

class Ferrari : Car { 
    public void speedup() { ... } 
    public void break() { ... } 
    public void steer() { ... } 
} 

Ora, in Java questo codice shou lavoro ld (cambiando qualche sintassi), ma in C# non lo faranno perché si dice:

Error 1 'Ferrari' does not implement inherited abstract member 'Car.speedup()' 
Error 1 'Ferrari' does not implement inherited abstract member 'Car.break()' 
Error 1 'Ferrari' does not implement inherited abstract member 'Car.steer()' 

Perché? Come dovrei risolvere questo problema?

risposta

16

è necessario marcare le modalità con override per coprire le definizioni abstract sotto:

class Ferrari : Car 
{ 
    public override void speedup() { } 
    public override void break() { } 
    public override void steer() { } 
} 

Oltre a questo, il gioco è fatto - la classe Ferrari in grado di soddisfare la vostra interfaccia, anche se i metodi sono derivati. Anche come un a parte, nominando in C# è leggermente diversa:

  • interfacce Prefisso con I, IAutomobile.
  • lettere maiuscole sui metodi: Speedup(), Break(), Steer().
+0

Credo che questa è una delle differenze tra Java e C# ... Grazie mille. – IssamTP

+0

@ amod0017 Fatto. Scusa per il ritardo ma sono piuttosto impegnato ad aspettare 7 minuti qui ... – IssamTP

+0

@IssamTP in realtà secondo i tempi sul sito, mi ci sono voluti solo 3 minuti per rispondere :-) –

3

In realtà si sta ignorando per ignorare i membri astratti della classe. Provate a prendere in considerazione qualcosa di simile:

interface IAutomobile 
{ 
    void Steer(); 
    void Break(); 
} 

abstract class Car : IAutomobile 
{ 
    public abstract void Steer(); 
    public abstract void Break(); 
} 

class Ferrari : Car 
{ 
    public override void Steer() 
    { 
     throw new NotImplementedException(); 
    } 

    public override void Break() 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Perché il "lanciare nuovo"? – IssamTP

+0

@IssamTP è un'implementazione automatica predefinita dei metodi, in modo che anche senza fornire un'implementazione verrà compilata, indipendentemente dal fatto che il metodo restituisca o meno un valore. – TrymBeast

1

bene, "Disconnetti" (sei italiano?) Metodo non è scritto da nessuna parte, quindi è necessario prima di noi spiegare da dove che viene da.

In secondo luogo, In C# quando si modifica un metodo astratto, è necessario esplicita attraverso il di override parola chiave

+0

Sì, sono italiano, il codice reale è leggermente diverso da quello pubblicato perché questo esempio era più facile da capire e da spiegare.Ad ogni modo ho modificato il codice abbastanza presto ... – IssamTP

+0

Ok, la risposta è solo che hai bisogno di sovrascrivere le parole chiave a proposito, come ho scritto (e anche altre). Buona fortuna col codice;) –