Национальный исследовательский ядерный университет «МИФИ»
Опубликован: 19.08.2004 | Доступ: свободный | Студентов: 6054 / 400 | Оценка: 4.16 / 3.86 | Длительность: 10:50:00
Специальности: Программист

Лекция 11: Расширенные возможности полиморфизма в языке C#

В ходе лекций неоднократно упоминалось понятие интерфейса. На данном этапе исследований становится возможным детально изучить данный механизм и рассмотреть особенности его реализации применительно к языку программирования C#.

Под интерфейсом будем понимать чисто абстрактный класс, который включает только описания языковых объектов и не содержит части, отвечающей за реализацию (implementation).

При реализации рассматриваемого механизма необходимо обеспечить выполнение следующих условий.

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

Кроме того, все элементы интерфейсов должны быть описаны как общедоступные ( public ) и абстрактные виртуальные ( virtual ).

В состав интерфейсов не могут входить статические элементы.

Механизм множественного наследования, рассмотренный ранее в ходе курса, может быть реализован посредством классов и структур (далее будет рассмотрен еще один пример подобного рода наследования).

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

Проиллюстрируем особенности использования механизма методов с приоритетами в языке программирования C# следующим фрагментом программы:

public interface IList : 
    ICollection, IEnumerable {
    int Add (object value);
    // методы
    bool Contains (object value);

    ...
    bool IsReadOnly { 
        get;
    }
    // свойства
    ...
    object this [int index] { 
        get; 
        set; 
    }    
    // индексатор
}

Как видно из приведенного примера, фрагмент программы на языке C# содержит описание общедоступного интерфейса IList на основе стандартных классов ICollection и IEnumerable. Интерфейс моделирует списковую структуру данных и оснащен методами Add для добавления объекта в список, Contains для установления принадлежности объекта списку и IsReadOnly для определения возможности записи в список (а, возможно, и рядом других методов), тем или иным набором свойств, а также индексатором.

Рассмотрим более подробно особенности реализации множественного наследования в языке программирования C#. Для достижения этой цели потребуется применить механизм интерфейсов для классов и структур.

Сформулируем требования, необходимые для реализации данного варианта механизма интерфейсов.

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

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

Подчеркнем, что важным свойством элементов, входящих в состав интерфейса (в частности, методов, свойств и индексаторов ) является возможность реализации или наследования свойств порождающего их класса.

Заметим далее, что реализованные методы интерфейса не могут быть замещенными, т.е. задаваться с помощью описателя override .

Наконец, методы, которые реализуются посредством интерфейса, могут снабжаться одним из описателей, virtual либо abstract . Таким образом, осуществляется возможность реализации механизма интерфейсов на основе абстрактного класса.

Проиллюстрируем особенности использования механизма методов с приоритетами в языке программирования C# следующим фрагментом программы:

class MyClass : 
    MyBaseClass, IList, ISerializable
    {
    public int Add (object value)
    {
        ...
    }
    public bool Contains (object value)
    {
        ...
    }
    ...
    public bool IsReadOnly
    {
        get {
            ...
        }
    }
    ...

    public object this [int index]
    {
        get {
        ...
        } 
        set {
            ...
        } 
    }
}

Как мы видим, фрагмент программы на языке C# содержит описание общедоступного интерфейса IList на основе стандартных классов ICollection и IEnumerable.

Данный пример во многом схож с предыдущим, однако имеет одно фундаментальное отличие от него.

Отличие заключается в том, что интерфейс IList в данном примере реализуется на основе базового класса MyBaseClass, определенного пользователем. При этом интерфейс IList в данном примере фактически получает возможность множественного наследования.

Заметим, что ни один из методов интерфейса Ilist не является замещенным.

Для более подробного самостоятельного ознакомления с тематикой лекции рекомендуется следующий список источников: [ 23, 26, 53, 59, 62, 63, 74-76].