Поиск

Комбинирование интерфейсов

Еще одна мощная функция С# — возможность комбинирования двух или более интерфейсов, и в итоге класс должен реализовать только результат комбинирования. Пусть вы хотите создать новый класс TreeView, реализующий оба интерфейса: IDragDrop и ISortable. Поскольку резонно предполагать, что и другим элементам управления, таким как ListView и ListBox, понадобится скомбинировать эти функции вам, возможно, захочется скомбинировать интерфейсы IDragDrop и ISortable в единое целое:

using System;
public class Control
{
}
public interface IDragDrop {
void DragQ; void Drop(); }
public interface ISerializable
{
void SerlalizeO;
}
public interface ICombo : IDragDrop,
ISerializable
{
// Этот интерфейс не дает ничего нового // (что касается поведения),
так как единственное его // назначение -
скомбинировать интерфейсы IDragDrop // и ISerializable в единый интерфейс.
}
public class MyTreeView : Control, ICombo
{
public void DragQ
{
Console.WriteLineC'MyTreeView.Drag called");
}
public void Drop()
{
Console.WriteLineC'MyTreeView. Drop called");
>
public void Serialize()
{
Console.WriteLineC'MyTreeView.Serialize called");
} }
class CombiningApp
{
public static void MainQ
{
MyTreeView tree = new MyTreeViewO;
tree.DragO; tree.DropQ; tree.SerializeO; }

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

Подведем итоги

Интерфейсы на С# обеспечивают разработку классов, у которых могут быть общие функции, но при этом они не являются частями одной и той же иерархии классов. Интерфейсы играют особую роль в разработке на С#, поскольку С# не поддерживает множественное наследование. Чтобы совместно использовать методы и свойства, классы могут реализовывать несколько интерфейсов. Операторы is и as позволяют определить, реализован ли конкретный интерфейс конкретным объектом, что помогает предотвратить ошибки, связанные с использованием членов интерфейса. Наконец, явное именование членов и сокрытие имен позволяют управлять реализацией интерфейса и избежать многих ошибок.