Интерфейсы определяют типы

Объявление интерфейса определяет ссылочный тип. В переменных этого типа можно хранить ссылки на объект, располагающийся в куче и удаляемый сборщиком мусора, который реализует контракт типа интерфейса.

Каждая переменная в CLR хранится в определенном месте памяти, будь то куча или стек. Каждое место хранения имеет ассоциированный с ним тип. Когда переменная, скажем, ссылка на объект, находится в этом месте, она должна быть того же типа, что и это местоположение, либо допускать преобразование к типу, ассоциированному с местоположением.

Если она может быть преобразована автоматически в тип местоположения, тогда она является неявно преобразуемой к типу этого места хранения.

Во многих примерах в качестве основы для демонстрации используется воображаемый каркас графического интерфейса (GUI); то же самое будет и здесь.

Взгляните на следующий фрагмент кода:

1
2
3
4
5
6
7
8
9
10
11
12
13
public interface IUIControl {
void Paint ();
}
public class Button : IUIControl {
public void Paint () {
// Нарисовать кнопку
}
}
public class ListBox : IUIControl {
public void Paint ()  {
// Нарисовать окно списка
}
}

В этом примере объявлен интерфейс IUIControl, который просто предоставляет один метод — Paint. Данный интерфейс определяет контракт, который устанавливает, что любой тип, реализующий этот интерфейс, должен реализовать метод Paint. Конечно, весьма желательно наличие некоторой документации, описывающей семантическое значение того, что должен делать Paint.

Например, интерфейс по имени I Artist может иметь метод Paint, но его смысл будет совершенно другим, чем в предыдущем примере, т.е. IUIControl. Paint, скорее всего, предложит элементу управления нарисовать себя, тогда как IArtist. Paint, вероятно, означает, что художник должен рисовать что-нибудь.

Обнаружилось, что методы удобно называть в соответствие как с действием, которое они выполняют, так и с направлением этого действия. Например, предположим, что метод IUIControl. Paint принимает в качестве параметра объект Graphics, сообщающий ему, где он должен рисовать себя.

По идее, код будет более читабельным, если метод назвать IUIControl. PaintSelf То. Таким образом, вызов метода читается как предложение на естественном (английском) языке — в том смысле, что вызов метода вроде control. PaintSelf То (myGraphicsObject) сообщает control о необходимости нарисовать себя на myGraphicsObject.

Как только классы ListBoxnButton из предыдущего примера реализуют интерфейс, они оба могут трактоваться как относящиеся к типу IUIControl. Полезно рассмотреть, как среда CLR справляется с этой ситуацией. Попытка сохранения любого экземпляра ListBox или Button в переменной типа IUIControl завершится успешно. Ссылки на эти конкретные типы неявно преобразуемы в интерфейсный тип IUIControl, поскольку оба реализуют этот интерфейс.

Однако чтобы привести ссылку на IUIControl обратно к ListBox или Button, потребуется явное приведение, и это приведение может потерпеть неудачу во время выполнения, если на самом деле ссылка IUIControl не будет указывать на экземпляр нужного конкретного типа.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100