Il motivo migliore per cui si eseguirebbe il cast sulle interfacce sarebbe se si scrive codice contro gli oggetti e non si conosce il tipo concreto che sono e non si desidera.
Se si sa che si potrebbe imbattersi in un oggetto che implementa un'interfaccia specifica, è possibile estrarre i valori dall'oggetto senza conoscere la classe concreta di questo oggetto. Inoltre, se si sa che un oggetto implementa una determinata interfaccia, tale interfaccia potrebbe definire metodi che è possibile eseguire per eseguire determinate azioni sull'oggetto.
Ecco un semplice esempio:
public interface IText
{
string Text { get; }
}
public interface ISuperDooper
{
string WhyAmISuperDooper { get; }
}
public class Control
{
public int ID { get; set; }
}
public class TextControl : Control, IText
{
public string Text { get; set; }
}
public class AnotherTextControl : Control, IText
{
public string Text { get; set; }
}
public class SuperDooperControl : Control, ISuperDooper
{
public string WhyAmISuperDooper { get; set; }
}
public class TestProgram
{
static void Main(string[] args)
{
List<Control> controls = new List<Control>
{
new TextControl
{
ID = 1,
Text = "I'm a text control"
},
new AnotherTextControl
{
ID = 2,
Text = "I'm another text control"
},
new SuperDooperControl
{
ID = 3,
WhyAmISuperDooper = "Just Because"
}
};
DoSomething(controls);
}
static void DoSomething(List<Control> controls)
{
foreach(Control control in controls)
{
// write out the ID of the control
Console.WriteLine("ID: {0}", control.ID);
// if this control is a Text control, get the text value from it.
if (control is IText)
Console.WriteLine("Text: {0}", ((IText)control).Text);
// if this control is a SuperDooperControl control, get why
if (control is ISuperDooper)
Console.WriteLine("Text: {0}",
((ISuperDooper)control).WhyAmISuperDooper);
}
}
}
l'esecuzione di questo piccolo programma vi darebbe il seguente output:
ID: 1
Testo: Sono un controllo di testo
ID: 2
Testo: io sono un altro controllo di testo
ID: 3
Testo: Just Because
Si noti che non ho avuto di scrivere qualsiasi codice nel metodo DoSomething che mi ha richiesto di sapere qualsiasi cosa su tutti gli oggetti su cui stavo lavorando essendo tipi di oggetti concreti. L'unica cosa che so è che sto lavorando su oggetti che sono almeno un'istanza della classe Control. Posso quindi usare l'interfaccia per scoprire cos'altro potrebbero avere.
C'è un milione di motivi diversi per adottare questo approccio con le interfacce sugli oggetti, ma ti dà un modo libero per accedere agli oggetti senza dover sapere esattamente di cosa si tratta.
Pensate a tutte le carte di credito del mondo, ogni azienda fa le proprie, l'interfaccia è la stessa però, così ogni lettore di carte può avere una carta passata attraverso di esso che segue lo standard. Simile all'utilizzo di interfacce.
La mia prima risposta è stata una conversione definita dall'utente esplicito, ma in realtà in base alle (6.4. 1) non è possibile definire un cast esplicito definito dall'utente su un'interfaccia. –
Ho trovato la sezione equivalente nell'ultima versione, ma sembra che sia un po 'diversa. –
@Jon - grazie per averlo visto su – eft