Вызов членов интерфейса на уровне объекта

Вызов членов интерфейса на уровне объекта

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

static void Main(string[] args) {

 // вызов члена Points интерфейса IPointy.

 Hexagon hex = new Hexagon();

 Console.WriteLine("Вершин: {0}", hex.Points);

 Console.ReadLine();

}

Этот подход прекрасно работает в данном конкретном случае, поскольку вы знаете, что тип Hexagon реализует упомянутый интерфейс. Однако в других случаях во время компиляции вы не сможете определить, какие интерфейсы поддерживаются данным типом. Предположим, например, что у нас есть массив из 50 типов, соответствующих Shape, но только некоторые из них поддерживают IPointy. Очевидно, что если вы попытаетесь вызвать свойство Points для типа, в котором IPointy не реализован, вы получите ошибку компиляции. Возникает следующий вопрос: "Как динамически получить информацию о множестве интерфейсов, поддерживаемых данным типом?"

Выяснить во время выполнения, поддерживает ли данный тип конкретный интерфейс можно, например, с помощью явного вызова. Если тип не поддерживает запрошенный интерфейс, вы получите исключение InvalidCastException. Чтобы "изящно" обработать эту возможность, используйте структурированную обработку исключений, например:

static void Main(string[] args) {

 …

 // Возможный захват исключения InvalidCastException.

 Circle с = new Circle ("Lisa");

 IPointу itfPt;

 try {

  itfPt = (IPointy)c;

  Console.WriteLine(itfPt.Points);

 } catch (InvalidCastException e) {

  Console.WriteLine(e.Message);

 }

 Console.ReadLine();

}

Итак, можно использовать логику try/catch и надеяться на удачу, но лучше еще до вызова членов интерфейса определить, какие интерфейсы поддерживаются. Мы рассмотрим два варианта такой тактики.

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

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

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

8.5.9 Видимость Имен Членов

Из книги C++ автора Хилл Мюррей

8.5.9 Видимость Имен Членов Члены класса, описанные с ключевым словом class, являюся закрытыми, то есть, их имена могут использоваться только функциями членами (#8.5.2) и друзьями (см. #8.5.10), если они не стоят после метки «public:». В этом случае они являются открытыми. Открытый член


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

Из книги Справочное руководство по C++ автора Страустрап Бьярн

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


Доступность членов

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

Доступность членов Прежде чем двигаться дальше, мы должны обсудить вопрос доступности, или "видимости" членов. Члены (методы, поля, конструкторы и т.д.) данного класса или структуры должны указать свой уровень доступности. Если член определяется без указания ключевого


Тестирование переопределенных членов

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

Тестирование переопределенных членов Теперь можно проверить обновленный класс Person. Добавьте следующий программный код в метод Main() и сравните результат его выполнения с тем, что показано на рис. 3.18.static void Main (string[] args) { // ВНИМАНИЕ: эти объекты должны быть идентичными. Person


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

Из книги Обработка баз данных на Visual Basic®.NET автора Мак-Манус Джеффри П

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


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

Из книги Внедрение SAP R/3: Руководство для менеджеров и инженеров автора Кале Вивек

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


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

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов. автора Дронов Владимир

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


Обучение членов команд проекта

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

Обучение членов команд проекта Планирование и реализация обучения членов команд проекта SAP позволяет им конфигурировать и тестировать предусмотренные Планом концептуального проектирования


Понятия объекта и экземпляра объекта

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

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


Понятия объекта и экземпляра объекта

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

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


Поиск членов

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

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


14.5. Список инициализации членов

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

14.5. Список инициализации членов Модифицируем наш класс Account, объявив член _name типа string:#include stringclass Account {public:// ...private:unsigned int _acct_nmbr;double _balance;string _name;};Придется заодно изменить и конструкторы. Возникает две проблемы: поддержание совместимости с первоначальным


17.2. Идентификация членов иерархии

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

17.2. Идентификация членов иерархии В разделе 2.4 мы уже упоминали о том, что в объектном проектировании обычно есть один разработчик, который конструирует и реализует класс, и много пользователей, применяющих предоставленный открытый интерфейс. Это разделение


18.3.2. Открытие отдельных членов

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

18.3.2. Открытие отдельных членов Когда мы применили закрытое наследование класса PeekbackStack от IntArray, то все защищенные и открытые члены IntArray стали закрытыми членами PeekbackStack. Было бы полезно, если бы пользователи PeekbackStack могли узнать размер стека с помощью такой