Лучшая причина, по которой вы должны выполнять приведение к интерфейсам, - это если вы пишете код для объектов, и вы не знаете, к какому конкретному типу они относятся, и не хотите знать.
Если вы знаете, что можете столкнуться с объектом, который реализует определенный интерфейс, вы можете получить значения из объекта, не зная конкретного класса, которым является этот объект. Кроме того, если вы знаете, что объект реализует данный интерфейс, этот интерфейс может определять методы, которые вы можете выполнять для выполнения определенных действий над объектом.
Вот простой пример:
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);
}
}
}
запуск этой небольшой программы даст вам следующий результат:
ID: 1
Текст: я текстовый элемент управления
ID: 2
Текст: я еще один текстовый элемент управления
ID: 3
Текст: Просто так
Обратите внимание, что мне не нужно было писать какой-либо код в методе DoSomething, который требовал бы от меня каких-либо знаний обо всех объектах, над которыми я работал, как о конкретных типах объектов. Единственное, что я знаю, это то, что я работаю над объектами, которые являются как минимум экземпляром класса Control. Затем я могу использовать интерфейс, чтобы узнать, что еще у них может быть.
Есть миллион различных причин, по которым вы могли бы использовать этот подход с интерфейсами на ваших объектах, но он дает вам свободный способ доступа к вашим объектам, не зная точно, что это такое.
Подумайте обо всех кредитных картах в мире, каждая компания делает свои собственные, хотя интерфейс одинаков, поэтому каждый кард-ридер может провести через него карту, соответствующую стандарту. Аналогично использованию интерфейсов.
person
Dean Poulin
schedule
06.03.2009