Программирование с использованием интерфейсов
Использование интерфейсов облегчает программирование на управляемом C++. Интерфейсы реализуются через классы, и для получения указателя на интерфейс можно выполнить приведение указателя на класс. Методы интерфейсов можно вызывать, используя и указатели на класс, и указатели на интерфейс; однако для того, чтобы полностью воспользоваться достоинствами полиморфизма, предпочтительно везде, где только возможно, использовать указатели на интерфейсы.
Реализация интерфейсов
В C++ указание того, что класс реализует интерфейс, осуществляется с помощью двоеточия, используемого также для указания наследования класса. Управляемый класс может наследовать от одного управляемого класса и, кроме этого, от одного или нескольких управляемых интерфейсов. В этом случае базовый класс должен указываться в списке первым, сразу после двоеточия. Заметим, что, в отличие от управляемых интерфейсов, наследование управляемых классов может быть только общедоступным.
_gc class HotelBroker: public Broker, public IHotellnfo, // класс сборщика мусора – HotelBroker: общедоступный Брокер, public IHotelAdmin, public IHotelReservation { … };
В этом примере класс HotelBroker является производным от класса Broker (Брокер) и реализует интерфейсы IHotellnfo, IHotelAdmin и IHotelReservation. В HotelBroker должны быть реализованы все методы этих интерфейсов, либо непосредственно, либо используя реализацию, унаследованную от базового класса Broker (Брокер).
Подробно пример использования интерфейсов будет рассмотрен в этой главе несколько позже, когда мы возьмемся за реализацию второго шага создаваемой системы.
А сейчас в качестве небольшого примера вышеизложенного, рассмотрим программу Smalllnterface. Класс Account (Счет) реализует интерфейс IBasicAccount. В описании этого интерфейса демонстрируется синтаксис объявления свойства интерфейса.
//Account.h _gc _interface IBasicAccount // сборщик мусора – IBasicAccount { void Deposit(Decimal amount); // Депозит (Десятичное // количество); void Withdraw(Decimal amount); // Снять (Десятичное // количество); _property Decimal get_Balance(); // Десятичное число }; _gc class Account: public IBasicAccount // сборщик мусора – класс Счет: IBasicAccount { private: // частный Decimal balance; // Десятичный баланс public: Account(Decimal balance) // Счет (Десятичный баланс) { this › balance = balance; // баланс } void Deposit(Decimal amount) // Депозит (Десятичное количество) { balance = balance + amount; // баланс = баланс + количество } void Withdraw(Decimal amount) // Снять (Десятичное количество) { balance = balance – amount; // баланс = баланс – количество } _property Decimal get_Balance() // Десятичное число { return balance; // баланс } };