Лучшая причина, по которой вы будете приводить к интерфейсам, заключается в том, что вы пишете код для объектов, и вы не знаете, что это за конкретный тип, и не хотите.
Если вы знаете, что можете встретить объект, который реализует определенный интерфейс, вы можете получить значения из объекта, не зная конкретного класса, которым является этот объект. Кроме того, если вы знаете, что объект реализует данный интерфейс, этот интерфейс может определять методы, которые вы можете выполнить для выполнения определенных действий над объектом.
Вот простой пример:
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. Затем я могу использовать интерфейс, чтобы узнать, что еще они могут иметь.
Существует миллион различных причин, по которым вы бы выбрали этот подход с интерфейсами для ваших объектов, но он дает вам свободный способ доступа к вашим объектам без необходимости точно знать, что это такое.
Подумайте обо всех кредитных картах в мире, каждая компания выпускает свою собственную, хотя интерфейс такой же, поэтому у каждого устройства для чтения карт может быть считана карта, соответствующая стандарту. Похоже на использование интерфейсов.