2009-02-12 14 views
28

In C#, quando ho un'interfaccia e diverse implementazioni concrete, posso lanciare l'interfaccia su un tipo concreto o il cast di tipo concreto da interfacciare?Interfaccia di trasmissione per l'oggetto di implementazione concreto o viceversa?

Quali sono le regole in questo caso?

+0

C#, tuttavia mi aspetto che la risposta sia corretta in tutte le lingue oo. – dotnetdev

+0

Questo tipo di cose è probabilmente simile nelle lingue OO, ma non necessariamente identico. Passare a C# in modo che possiamo fornire una risposta specifica per te. –

risposta

33

Entrambe le direzioni sono consentite in Java e C#. Downcasting richiede un cast esplicito e può generare un'eccezione se l'oggetto non è del tipo corretto. L'upcasting, tuttavia, non ha bisogno di cast esplicito ed è sempre sicuro.

vale a dire, a patto di avere public interface Animal e due implementazioni di questo interface, Cat e Dog ....

Animal meowAnimal = new Cat(); // No cast required 
Animal barkAnimal = new Dog(); // No cast required 

Cat myCat = (Cat) meowAnimal; // Explicit cast needed 
Dog myDog = (Dog) barkAnimal; // Explicit cast needed 

Dog myPet = (Dog) meowAnimal; // Will compile but throws an Exception 

e si vorrà un try/catch intorno ai cast espliciti. In C# si ha la utili as parola chiave:

Dog myDog = barkAnimal as Dog; 
Dog myPet = meowAnimal as Dog; 

Nessuna eccezione saranno gettati, e miocane sarà non nullo e myPet sarà nullo. Java non ha una parola chiave equivalente sebbene sia sempre possibile utilizzare i test if (meowAnimal instanceof Dog) per mantenere la sicurezza del tipo. (Direi che il "as" parola chiave genera bytecode che fa il caso, assegnando nulla della is fallisce. Ma forse NET ha un'istruzione bytecode che fa l'equivalente di "as".)

+1

Che dire "è": if (meowAnimal è Dog) {Dog d = (Cane) meowAnimal} –

+0

Puoi anche usare la parola chiave "is" per evitare di eseguire eccezioni. – Eddie

+8

facendo un cast 'as' e un controllo nullo è preferibile a un controllo 'is' e un cast esplicito quando si finisce col castare due volte, una volta per il quale restituisce vero o falso e poi una volta per il cast esplicito ((Cane) animale). –

0

Entrambi sono validi, considerando che è un cast logico. Molte volte, i vostri utenti di interfaccia non hanno accesso alle classi concrete che è uno dei motivi principali per avere un'interfaccia in primo luogo.

3

Se si sta parlando di Java (ma le regole per altre lingue sono simili), è in questo modo:

È possibile (verso il basso) lanciare un interfaccia per un'implementazione concreta, se e solo se il riferimento lanci in realtà è un riferimento all'attuazione concreta specifica. Ciò significa che

Vehicle v=new Car(); 
(Car)v // this is OK 
(Bus)v // this is not 

L'errore si manifesta come ClassCastException in Java.

È possibile trasmettere gratuitamente un'implementazione concreta di un'interfaccia all'interfaccia.

+0

Ho passato la domanda originale a C#, quindi la tua risposta non è più pertinente. Scusate. –

13

Nella maggior parte delle lingue è possibile trasmettere entrambe le direzioni. Se hai una lezione concreta, puoi lanciarla nell'interfaccia. Se hai un'interfaccia, è possibile trasmettere alla classe concreta.

Generalmente, si desidera solo andare nella prima direzione. Il motivo è che non si dovrebbe sapere qual è la classe concreta quando si ha solo un puntatore all'interfaccia. Se stai passando qualcosa in giro come interfaccia, dovresti essere in grado di fare tutto il necessario da quella interfaccia. Se ti ritrovi a dover utilizzare parti dell'oggetto concreto non nell'interfaccia, hai un problema di progettazione che dovrebbe essere risolto invece di eseguire il cast.

+0

Che mi dici di WPF? Cosa succede se ottengo interfacce indietro da un servizio e ho bisogno di convertirli ViewModels per associare un'interfaccia utente WPF? – Darkonekt

0

Un interfaccia può essere l'intera classe, se tuttavia non deve essere essere, è meglio quando si crea un costruttore che accetta l'interfaccia come parametro e copia le impostazioni, in questo modo si ha il controllo su ciò che accade e ciò che è necessario.

Problemi correlati