Создание обобщенных базовых классов

Создание обобщенных базовых классов

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

// Предположим, что создан пользовательский

// обобщенный класс списка.

public class MyList‹T› {

 private List‹T› listOfData = new List‹T›();

}

// Конкретные типы должны указать параметр типа,

// если они получаются из обобщенного базового класса.

public class MyStringList: MyList‹string› {}

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

// Обобщенный класс с виртуальным методом.

public class MyList‹T› {

 private List‹T› listOfData = new List‹T›();

 public virtual void PrintList(T data) {}

}

public class MyStringList: MyList‹string› {

 // В производных методах нужно заменить параметр типа,

 // используемый а родительском классе.

 public override void PrintList(string data) {}

}

Если производный тип тоже является обобщенным, дочерний класс может (опционально) использовать заменитель типа в своем определении. Однако знайте, что любые ограничения, размещенные в базовом классе, должны "учитываться" и производным типом. Например:

// Обратите внимание, теперь здесь имеется ограничение,

// требующее конструктор по умолчанию.

public class MyList‹T› where T: new() {

 private List‹T› listOfData = new List‹T›();

 public virtual void PrintList(T data) {}

 // Производный тип должен учитывать ограничения базового.

 public class MyReadOnlyList‹T›: MyList‹T› where T: new() {

  public override void PrintList(T data) {}

}

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

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Лекция № 8. Создание базовых отношений

Из книги Базы данных: конспект лекций автора Автор неизвестен

Лекция № 8. Создание базовых отношений Предметом этой лекции будет довольно подробное рассмотрение оператора создания базового отношения. Мы подвергнуть разбору сам оператор в записи на псевдокоде, проанализируем все его составляющие и их работу, разберем способы


R.12.6.2 Инициализация членов и базовых классов

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

R.12.6.2 Инициализация членов и базовых классов В определении конструктора можно задать инициализацию прямых базовых классов и членов, не наследуемых из базовых классов. Это особенно полезно для тех объектов, констант и ссылок, для которых различаются семантики


Роль библиотек базовых классов

Из книги Объектно-ориентированный анализ и проектирование с примерами приложений на С++ автора Буч Гради

Роль библиотек базовых классов В дополнение к спецификациям CLR и CTS/CLS, платформа .NET предлагает библиотеку базовых классов, доступную всем языкам программирования .NET. Эта библиотека базовых классов не только инкапсулирует различные примитивы, такие как потоки, файловый


Управление созданием базовых классов с помощью base

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

Управление созданием базовых классов с помощью base В настоящий момент SalesPerson и Manager можно создать только с помощью конструктора, заданного по умолчанию. Поэтому предположим, что в тип Manager добавлен новый конструктор с шестью аргументами, который вызывается так, как


Создание обобщенных методов

Из книги Стандарты программирования на С++. 101 правило и рекомендация автора Александреску Андрей

Создание обобщенных методов Чтобы научиться интегрировать обобщения в проекты, мы начнем с простого примера обычной подпрограммы свопинга. Целью этого примера является построение метода обмена, который сможет работать c любыми типами данных (характеризуемыми


Создание обобщенных структур (и классов)

Из книги VBA для чайников автора Каммингс Стив

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


Создание пользовательских обобщенных коллекций

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

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


Создание обобщенных интерфейсов

Из книги автора

Создание обобщенных интерфейсов Вы уже видели при рассмотрении пространства имен System.Collections. Generiс, что обобщенные интерфейсы в C# также допустимы (например, IEnumerable‹Т›). Вы, конечно, можете определить свои собственные обобщенные интерфейсы (как с ограничениями, так и без


Соответствие между типами библиотеки базовых классов .NET, C# и CIL

Из книги автора

Соответствие между типами библиотеки базовых классов .NET, C# и CIL В табл. 15.4 показано соответствие между типами базовых классов .NET и ключевыми словами C#, а также между ключевыми словами C# и командами CIL. Там же представлены сокращенные обозначения констант, используемые для


Глава 9 Среда разработки: библиотека базовых классов

Из книги автора

Глава 9 Среда разработки: библиотека базовых классов Основным преимуществом объектно-ориентированных языков программирования, таких, как C++ и Smalltalk, является высокая степень повторного использования в хорошо спроектированных системах. Это означает, что для разработки


1.3.4. Создание классов

Из книги автора

1.3.4. Создание классов В Ruby есть множество встроенных классов, и вы сами можете определять новые. Для определения нового класса применяется такая конструкция:class ClassName# ...endСамо имя класса - это глобальная константа, поэтому оно должно начинаться с прописной буквы.


11.2.4. Создание параметрических классов

Из книги автора

11.2.4. Создание параметрических классов Изучи правила, потом нарушай их. Басё Предположим, что нужно создать несколько классов, отличающихся только начальными значениями переменных уровня класса. Напомним, что переменная класса обычно инициализируется в самом


50. Делайте деструкторы базовых классов открытыми и виртуальными либо защищенными и невиртуальными

Из книги автора

50. Делайте деструкторы базовых классов открытыми и виртуальными либо защищенными и невиртуальными РезюмеУдалять или не удалять — вот в чем вопрос! Если следует обеспечить возможность удаления посредством указателя на базовый класс, то деструктор базового класса


Создание модулей классов

Из книги автора

Создание модулей классов В VBA класс является шаблоном, по которому создаются подобные объекты. Класс определяет, какие свойства, методы и события должен иметь объект и как должен "вести" себя каждый из этих компонентов.Чтобы создать класс, начните со вставки нового модуля


Ограничения на параметры обобщенных подпрограмм и классов

Из книги автора

Ограничения на параметры обобщенных подпрограмм и классов По умолчанию с переменными, имеющими тип параметра обобщенного класса или подпрограммы, внутри методов обобщённых классов и обобщенных подпрограмм можно делать лишь ограниченный набор действий: присваивать и