In C #, qual è il vantaggio dell'assegnazione di una variabile di classe a una variabile di interfaccia prima di chiamare qualsiasi metodo?

0

Dove lavoro sviluppiamo in C # .NET e stavo cercando un codice che hanno creato (il mio compito è di ottimizzarlo) ma ho visto qualcosa in particolare:

Supponendo che InterfaceDHO sia un'interfaccia e ClassDHO sia una classe che implementa InterfaceDHO .

Codice:

InterfaceDHO in1;
ClassDHO cl1 = new ClassDHO();

in1 = cl1;

in1.METHODHERE(ARG HERE, ARG2 HERE);

Perché stanno facendo questo? Perché assegnare l'istanza ClassDHO a un'interfaccia?

    
posta Horacio Garza 11.12.2015 - 16:10
fonte

4 risposte

8

Se ClassDHO implementa InterfaceDHO come segue:

class ClassDHO : InterfaceDHO
{
    void InterfaceDHO.METHODHERE(arg1, arg2) ...
}

allora METHODHERE è ciò che viene definito un'implementazione esplicita dell'interfaccia e può essere accessibile solo tramite una variabile di tipo InterfaceDHO . Il codice che mostri è un po 'prolisso, ma gestisce quella situazione. Potrebbe essere comunque semplificato a quanto segue:

InterfaceDHO in1 = new ClassDHO();

in1.METHODHERE(ARG HERE, ARG2 HERE);

Tuttavia, se questo non è il caso, il codice seguente, almeno per lo snippet di piccole dimensioni che fornisci, ha lo stesso effetto:

var in1 = new ClassDHO();  // in1 will be of type ClassDHO

in1.METHODHERE(ARG HERE, ARG2 HERE);

In altre parole, la variabile di interfaccia non è richiesta.

Fornisci un codice molto piccolo e in1 può essere usato in altri modi nel codice (o potresti aver perso alcuni bit), quindi non è possibile dirlo con certezza.

    
risposta data 11.12.2015 - 16:57
fonte
6

Non esiste un'istanza di un'interfaccia. Le interfacce sono implementate dalle classi. Le classi sono istanziate. I riferimenti sono conservati, sia per le classi, sia per le interfacce.

Ciò a cui stai assistendo è (probabilmente) un programmatore che cerca di aderire al (molto buono) principio chiamato Programma per l'interfaccia, non per un'implementazione. Vedi:

Quindi, se le linee che hai mostrato sono il codice reale, allora questo programmatore potrebbe essere un po 'confuso. Ma se le linee che ci stai mostrando sono state prelevate da diversi punti del codice, (poiché le righe vuote sembrano suggerire discontinuità nella lista del codice), allora quello che sta succedendo è che il codice che rende la chiamata al metodo non voglio sapere qualcosa sull'implementazione ( ClassDHO ), vuole solo lavorare con l'interfaccia ( InterfaceDHO ).

    
risposta data 11.12.2015 - 16:39
fonte
3

È possibile che ClassDHO non implementi effettivamente InterfaceDHO , e il codice stia facendo una conversione implicita (anche se non penso che sia necessario un ulteriore passaggio anche allora).

È possibile che esistessero diverse implementazioni dell'interfaccia in quel codice, quindi era logico dividere le variabili, ma quando gli altri sono stati rimossi questo codice non è stato ripulito.

Più probabilmente, però, il codice è stato semplicemente scritto da qualcuno che stava male alla programmazione.

    
risposta data 11.12.2015 - 16:28
fonte
3

Stai assegnando l'interfaccia senza creare un'istanza

Non c'è nulla da ottimizzare

Hai solo alcune linee di codice che hanno a che fare con l'interfaccia.
È chiaro che la sezione del codice si preoccupa solo dei metodi e delle proprietà dell'interfaccia.

Potresti avere qualcosa di simile (supponendo che ClassDHO2 implementa InterfaceDHO)

InterfaceDHO in1;
if(x > y)
{
   ClassDHO  = new ClassDHO();
   in1 = cl1; 
}
else 
{
   ClassDHO2 cl2 = new ClassDHO2();
   in1 = cl2;
}

in1.METHODHERE(ARG HERE, ARG2 HERE);

Considera una chiamata al metodo.
Puoi passarlo a una classe che implementa InterfaceDHO (cl1) o la tua variabile in1.

public void(InterfaceDHO interfaceDHO) 
{
}
    
risposta data 11.12.2015 - 16:35
fonte

Leggi altre domande sui tag