In C#, se una classe ha tutti i metodi corretti/firme per un'interfaccia, ma non lo fa esplicitamente implementarlo come:C# e Interfacce - espliciti vs implicito
class foo : IDoo {}
Può il la classe sarà ancora lanciata come quell'interfaccia?
In C#, se una classe ha tutti i metodi corretti/firme per un'interfaccia, ma non lo fa esplicitamente implementarlo come:C# e Interfacce - espliciti vs implicito
class foo : IDoo {}
Può il la classe sarà ancora lanciata come quell'interfaccia?
No, non è come l'Objective-C e alcune altre lingue. Dovresti dichiarare esplicitamente l'implementazione dell'interfaccia.
A condizione che IDoo abbia membri, questo codice non verrà compilato. Se IDoo non ha membri, allora sì, il cast è sicuro (ma ovviamente di uso limitato).
buon punto sul "limite ovvio" d usa "+1 –
L'OP specifica chiaramente * se una classe ha tutti i metodi/firme corretti per un'interfaccia *, ma se non lo fa, allora il tuo punto è notevole. –
public class A
{
public void DoSomething();
}
public interface IDoSomething
{
void DoSomething();
}
public class B : A, IDoSomething
{ }
soddisfa B IDoSomething.DoSomething ereditando dalla A
Ciò fondamentalmente richiederebbe duck typing a lavorare in C#, cosa che non avviene automaticamente.
Ci sono alcuni libraries che possono farlo, però.
duck typing
Quello che sta alludendo a che viene definito come "duck-typing" (prende il nome dal linguaggio "se sembra un'anatra, e fa qua qua come un'anatra, allora deve essere un'anatra").
Con la dattilografia, un'implementazione dell'interfaccia è implicita una volta implementati i membri rilevanti (proprio come si descrive), tuttavia .NET al momento non ha un ampio supporto per questo.
Con le caratteristiche del linguaggio dinamico emergenti pianificate per il futuro, non sarei sorpreso se questo fosse supportato in modo nativo dal runtime nel prossimo futuro.
Nel frattempo, si può sintetizzare anatra tipizzazione attraverso la riflessione, con a library such as this, che permetterebbe di fare un cast d'anatra digitato in questo modo: IDoo myDoo = DuckTyping.Cast<IDoo>(myFoo)
alcune curiosità
È interessante notare che, c'è un piccolo posto in cui la tipizzazione delle anatre è in uso in C# oggi: l'operatore foreach
. Krzysztof Cwalina states che per essere enumerable dall'operatore foreach
, una classe deve:
Fornire un metodo pubblico GetEnumerator che non richiede parametri e restituisce un tipo che ha due membri: a) un metodo MoveMext che non accetta parametri e restituisce un booleano, e b) una proprietà Corrente con un getter che restituisce un oggetto .
Si noti che non fa menzione di IEnumerable
né IEnumerator
. Sebbene sia comune implementare queste interfacce quando si crea una classe enumerabile, se si abbandonano le interfacce ma si lascia l'implementazione, la classe sarà comunque enumerabile per foreach
. Ecco! Duck-tipizzazione! (Example code here.)
+1 per curiosità! Bello uno –
Grazie. Non ho avuto il tempo di controllare la digitazione di qualcosa e l'ho sempre dimenticato. Hai servito le informazioni sul piatto d'argento. –
Quindi genererà un'eccezione se la getto come interfaccia? –
Sì, se la tua classe non implementa esplicitamente l'interfaccia otterrai un'eccezione se proverai a lanciarlo come tale. –
È possibile eseguire il cast di un oggetto su un oggetto che appare in qualche punto della catena di ereditarietà (ciò include le interfacce implementate nella catena di ereditarietà). – Powerlord