Продолжим наше обсуждение вопросов создания пользовательских интерфейсов и рассмотрим тему
// Базовый интерфейс.
public interface IDrawable { void Draw(); }
public interface IPrintable: IDrawable
public interface IMetaFileRender: IPrintable
Соответствующая цепочка наследования показана на рис. 7.5.
Рис. 7.5. Иерархия интерфейсов
Теперь, если некоторый класс должен поддерживать все варианты поведения, заданные в рамках этой иерархии интерфейсов, то этот класс должен выводиться из интерфейса, лежащего в основе иерархии (в данном случае это IMetaFileRender). Все методы, определенные базовым интерфейсом (или интерфейсами), автоматически переносятся в определение. Например:
// Этот класс поддерживает IDrawable, IPrintable и IMetaFileRender
public class SuperImage: IMetaFileRender {
public void Draw() { Console.WriteLine("Базовая логика визуализации."); }
public void Print() { Console.WriteLine("Вывод на принтер."); }
public void Render() { Console WriteLine("Вывод в метафайл."); }
}
Вот пример вывода каждого интерфейса из экземпляра SuperImage.
// Использование интерфейсов.
static void Main(string[] args) {
SuperImage si = new SuperImage();
// Получение IDrawable.
IDrawable itfDraw = (IDrawable)si;
itfDraw.Draw();
// Получение IMetaFileRender, который использует все методы,
// определенные выше по цепочке интерфейсов.
if (itfDraw is IMetaFileRender) {
IMetaFileRender itfMF = (IMetaFileRender)itfDraw;
itfMF.Render();
itfMF.Print()
}
Console.ReadLine();
}
Интерфейсы с множеством базовых интерфейсов
При построении иерархии интерфейсов вполне допустимо создавать интерфейсы, которые оказываются производными от нескольких базовых интерфейсов. Однако напомним, что
public interface ICar { void Drive(); }
public interface IUnderwaterCar { void Dive(); }
// Здесь интерфейс имеет ДВА базовых интерфейса.
public interface IJamesBondCar: ICar, IUnderwaterCar
На рис. 7.6 показана соответствующая цепочка интерфейсов.
Рис. 7.6. Общая система типов (CTS) допускает множественное наследование интерфейсных типов
При построении класса, реализующего IJamesBondCar (машина Джеймса Бонда), вы должны реализовать TurboBoost(), Dive() и Drive().
public class JamesBondCar: IJamesBondCar {
public void Drive() { Console.WriteLine("Ускорение…"); }
public void Dive() { Console.WriteLine("Погружение…"); }
public void TurboBoost() { Console.WriteLine{"Взлет!"); }
}
Этот специализированный автомобиль можно использовать так, как и ожидается.
static void Main(string[] args) {
…
JamesBоndCar j = new JamesBondCar();
j.Drive();
j.TurboBoost();
j.Dive();
}
Реализация интерфейсов в Visual Studio 2005