Определение типов класса

Определение типов класса

Пустые пространства имен не представляют собой большого интереса, поэтому давайте выясним, как в CIL определяется тип класса. Вполне логично, что для этого используется директива .class. Однако эта простая директива может иметь множество дополнительных атрибутов, уточняющих природу создаваемого типа. Для примера мы добавим простой общедоступный класс с именем MyBaseClass. Как и в C#, если не указать базовый класс явно, соответствующий тип будет автоматически получаться из System.Object.

.namespace MyNamespace {

 // В качестве базового класса предполагается System.Object.

 .class public MyBaseClass {}

}

Для создания типа класса, являющегося производным от любого класса, отличного от System.Object, используется атрибут extends. При ссылке на тип, определенный в пределах того же компоновочного блока, CIL требует, чтобы вы указали абсолютное имя (однако для базового класса из того же компоновочного блока вы можете опустить префикс, представляющий понятное имя компоновочного блока). Так, следующий вариант модификации MyBaseClass приведет к ошибке компиляции.

// Это компилироваться не будет!

.namespace MyNamespace {

 .class public MyBaseClass {}

 .class public MyDerivedClass extends MyBaseClass {}

}

Чтобы корректно определить родительский класс для MyDerivedClass, следует указать полное имя MyBaseClass, как показано ниже.

// Так будет лучше!

.namespace MyNamespace {

 .class public MyBaseClass {}

 .class public MyDerivedClass extends MyNamespace.MyBaseClass {}

}

Вдобавок к атрибутам public и extends определение класса CIL может иметь множество дополнительных спецификаторов, задающих параметры видимости типа, размещения полей и т.д. В табл. 15.3 предлагаются описаний некоторых атрибутов, которые могут использоваться с директивой .class.

Таблица 15.3. Атрибуты, которые могут использоваться с директивой .class

Атрибут Описание
public, private, nested assembly, nested famandassem, nested family, nested famorassem, nested public, nested private В CIL определяется множество атрибутов, используемых для указании параметров видимости типа. Как видите, CIL предлагает целый ряд возможностей, не доступных в C#
abstract sealed Эти два атрибута можно добавить к директиве.class, чтобы определить абстрактный класс или изолированный класс, соответственно
auto sequential explicit Эти атрибуты используются для информирования CLR о том, как следует размещать поля данных в памяти. Для типов класса вполне подойдет вариант, используемый по умолчанию (auto)
extends implements Эти атрибуты позволяют определить базовый класс типа (с помощью extends) или реализовать интерфейс (с помощью implements)
Поделитесь на страничке

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

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

7.2 Определение типов и содержания документов

Из книги ИНФОРМАЦИОННАЯ ТЕХНОЛОГИЯ. РУКОВОДСТВО ПО УПРАВЛЕНИЮ ДОКУМЕНТИРОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ автора Автор неизвестен

7.2 Определение типов и содержания документов Ниже дана схема основных типов программных документов. Данная схема не является исчерпывающей или окончательной, но будет служить контрольной таблицей основных типов программных документов, которые руководители должны


Определение открытого интерфейса класса

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

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


Преобразования типов класса

Из книги Delphi. Учимся на примерах автора Парижский Сергей Михайлович

Преобразования типов класса Как показано в главе 4, типы класса могут быть связаны классическим отношением наследования (отношение "is-a"). В этом случае в C# процесс преобразования позволяет сдвигаться вверх или вниз по иерархии классов. Например, производный класс всегда


Определение членов типов в CIL

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

Определение членов типов в CIL Вы уже знаете, что типы .NET могут определить различные члены. Перечни содержат некоторый набор пар имен и значений. Структуры и классы могут иметь конструкторы, поля, методы, свойства, статические члены и т.д. В предыдущих 14 главах вы уже могли


Определение конструкторов типов

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

Определение конструкторов типов Система CTS (общая система типов) поддерживает конструкторы как уровня экземпляра, так и уровня класса (статические конструкторы). В терминах CIL для конструкторов уровня экземпляра используется лексема .ctor, а для статических конструкторов


Определение членов класса

Из книги C++. Сборник рецептов автора Диггинс Кристофер

Определение членов класса Все члены класса по характеру доступа к ним делятся на четыре категории: закрытые (private), защищенные (protected), открытые (public) и опубликованные (published).Элементы класса, определенные в разделе public, без каких-либо ограничений открыты для доступа извне


11.2.10. Автоматическое определение методов чтения и установки на уровне класса

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

11.2.10. Автоматическое определение методов чтения и установки на уровне класса Мы уже рассматривали методы attr_reader, attr_writer и attr_accessor, которые немного упрощают определение методов чтения и установки атрибутов экземпляра. А как быть с атрибутами уровня класса?В Ruby нет


Определение своих собственных типов данных

Из книги C++ для начинающих автора Липпман Стенли

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


5.6. Определение ограниченных типов значений

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

5.6. Определение ограниченных типов значений ПроблемаТребуются самопроверяющиеся типы числовых данных, представляющие числа в ограниченном диапазоне допустимых значений, гаком как часы в сутках или минуты в часе.РешениеПри работе с датами и временем часто возникает


8.7. Определение, является ли класс объекта подклассом другого класса

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

8.7. Определение, является ли класс объекта подклассом другого класса ПроблемаИмеется два объекта и требуется узнать, имеют ли их классы отношения на уровне базовый класс/производный класс, или они не связаны друг с другом.РешениеИспользуйте оператор dynamic_cast, который


Определение класса символов и преобразование символов

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

Определение класса символов и преобразование символов Функция Краткое описание isalnum проверка на букву или цифру isalpha проверка на букву isascii проверка на символ из набора кодировки ASCII iscntrl проверка на управляющий символ isdigit проверка на десятичную


13.1. Определение класса

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

13.1. Определение класса Определение класса состоит из двух частей: заголовка, включающего ключевое слово class, за которым следует имя класса, и тела, заключенного в фигурные скобки. После такого определения должны стоять точка с запятой или список объявлений:class Screen { /* ... */


13.1.5. Объявление и определение класса

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

13.1.5. Объявление и определение класса О классе говорят, что он определен, как только встретилась скобка, закрывающая его тело. После этого становятся известными все члены класса, а следовательно, и его размер.Можно объявить класс, не определяя его. Например:class Screen; //


16.1. Определение шаблона класса

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

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


17.2.1. Определение базового класса

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

17.2.1. Определение базового класса * Члены Query представляют: множество операций, поддерживаемых всеми производными от него классами запросов. Сюда входят как виртуальные операции, переопределяемые в производных классах, так и невиртуальные, разделяемые всеми производными


17.7.1. Определение класса UserQuery

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

17.7.1. Определение класса UserQuery Объект класса UserQuery можно инициализировать указателем на вектор строк, представляющий запрос пользователя, или передать ему адрес этого вектора позже, с помощью функции-члена query(). Это позволяет использовать один объект для нескольких