Определение и реализация интерфейсов
Определение и реализация интерфейсов
Как бы это странно ни выглядело, типы интерфейса определяются в CIL с помощью директивы .class. Но когда директива .сlass сопровождается атрибутом interface, соответствующий тип реализуется, как тип интерфейса CTS (Common Type System – общая система типов). После определения интерфейс можно привязать к типу класса или структуры с помощью CIL-атрибута implements.
.namespace MyNamespace {
// Определение интерфейса.
.class public interface IMyInterface {}
.class public MyBaseClass {}
// Теперь DerivedTestClass реализует IAmAnInterface.
class public MyDerivedClass
extends MyNamespace.MyBaseClass implements MyNamespace.IMyInterface {}
}
Как было показано в главе 7, интерфейсы могут выступать в качестве базовых интерфейсов в отношении других типов интерфейса, в результате чего создаются иерархии интерфейсов. Однако, вопреки вашим возможным догадкам, атрибут extends нельзя использовать для получения интерфейса А из интерфейса В. Атрибут extends используется только для указания базового класса типа. Чтобы расширить интерфейс, вы должны еще раз использовать атрибут implements.
// Расширение интерфейсов в терминах CIL.
.class public interface IMyInterface {}
.class public interface IMyOtherInterface implements MyNamespace.IMyInterface {}
Определение структур
Директива .class может использоваться и для определения CTS-структуры, если соответствующий тип расширяет System.ValueType. Кроме того, такая директива .class сопровождается атрибутом sealed (поскольку структура не может быть базовой по отношению к другим типам, характеризуемым значениями). Если вы попытаетесь сделать иначе, ilasm.exe сгенерирует ошибку компиляции.
// Структура всегда должна быть изолированной.
.class public sealed MyStruct extends [mscorlib]System.ValueType {}
Полезно знать о том, что CIL предлагает специальное сокращение для определения типа структуры. Если вы используете атрибут value, новый тип будет производным от [mscorlib] System.ValueType и получит атрибут sealed автоматически. Таким образом, можно определить MyStruct так.
// Сокращенная запись для определения структуры.
.class public value MyStruct{}