2015-11-26 26 views
6

Prima cosa prima. Spero che il mio titolo non sia fuorviante. Ho fatto del mio meglio per esprimerlo.Inherit Class1 e implementare Interface1 sia nel caso in cui Class1 implementa già Interface1

Ora, vedere il codice qui sotto. Il caso 1 è piuttosto semplice. Entrambi i casi funzionano come previsto. La mia domanda è: perché il compilatore consente il caso 2? Ci sono scenari specifici quando ciò è desiderato. Non riesco a pensare a uno.

interface IEmployee 
{ 
    void Register(string role); 
} 

abstract class Employee : IEmployee 
{ 
    public void Register(string role) 
    { 
     Console.WriteLine(role); 
    } 
} 

// Case 1 
class Manager : Employee 
{ 
} 

// Case 2 
class Developer : Employee, IEmployee 
{ 
} 

class Test 
{ 
    public void Test1() 
    { 
     IEmployee emp1 = new Manager(); 
     emp1.Register("manager"); // output "manager" 

     IEmployee emp2 = new Developer(); 
     emp2.Register("developer"); // output "developer" 
    } 
} 
+0

Quando si sta ereditando da Employee vostro già eredita da IEmployee perché Employee eredita da IEmployee, appena Eredita da Dipendente o IEmployee invece di entrambi. Questo risponde alla tua domanda o stai chiedendo perché funziona? – CalebB

+0

@ CalebB So già cosa hai spiegato. La domanda è: perché il caso 2 è permesso a tutti? Esistono casi d'uso per tale progettazione? – niksofteng

+0

È consentito perché IEmployee viene implementato tramite l'ereditarietà di Employee che implementa tutti i membri IEmployee necessari. Non è necessario fare quanto so perché è possibile dichiarare esplicitamente IEmployee. per l'implementazione del membro nella classe Developer tramite l'ereditarietà di Employee. – CalebB

risposta

3

modificare

come mi aspettavo la risposta può essere trovata nella specifica C#

alcuni slogan:

13.4.5 Interfaccia implementazione eredità

Senza esplicitamente ri-implementazione di un'interfaccia, una classe derivata non può in alcun modo modificare i mapping di interfaccia che eredita dalle classi base

13.4.6 Interfaccia ri-attuazione

Una classe che eredita un'implementazione interfaccia è consentito di re-implementare l'interfaccia includendo nella lista classe base

saperne di più per studiare tutti i casi (copia digitale può essere trovato in cartelle di Visual Studio)


primo pensiero: caso 2 è permesso almeno perché le interfacce possono essere implementate esplicitamente ( sample). si è rivelato essere un sottoinsieme di opzioni disponibili

public interface IEmployee 
{ 
    void Register(string role); 
} 

public abstract class Employee : IEmployee 
{ 
    public void Register(string role) 
    { 
     Console.WriteLine(role); 
    } 
} 

// Case 2 
public class Developer : Employee, IEmployee 
{ 
    // this will not work without IEmployee in declaration! 
    void IEmployee.Register(string role) 
    { 
     Console.WriteLine("i'm developer!"); 
    } 
} 
public class Program 
{ 
    public static void Main() 
    { 
     var dev = new Developer(); 
     dev.Register("senior"); 

     IEmployee e = dev; 
     e.Register("senior"); 
    } 
} 

stampa del programma:

senior 
i'm developer! 

primo valore viene dal Employee.Register

secondo valore - da Developer.Register


se Developer definito come

// Case 2 
public class Developer : Employee 
{ 
    public void Register(string role) 
    { 
     Console.WriteLine("i'm developer!"); 
    } 
} 

uscita dello stesso programma è:

i'm developer! 
senior 
+0

Hanno bisogno di ereditare esplicitamente IEmployee per fare quel versetto che eredita Dipendente, quindi fare come mostrato sopra? – CalebB

+0

sì, se hanno bisogno di risultati diversi del metodo 'Register' quando si utilizza come' Employee' e 'IEmployee' – ASh

+0

@CalebB, ho aggiunto ulteriori dettagli su tale situazione e l'esempio aggiornato – ASh