Явное определение интерфейсов. Родовые интерфейсы в .NET.
При использовании интерфейсов может возникать неопределенность в случае, если в двух реализованных классом интерфейсах есть методы с одинаковыми именами и сигнатурами. Просмотрим, например, следующие версии интерфейсов lAccount и IStatement. Обратите внимание, что в каждом из них есть метод Show (Показать).
_gc _interface lAccount // сборщик мусора – IAccount { void Deposit(Decimal amount); // Депозит (Десятичное // количество) void Withdraw(Decimal amount); // Снять (Десятичное количество) _property Decimal get_Balance(); // Десятичное число void Show(); // Показать }; _gc _interface IStatement // сборщик мусора – IStatement { _property int get_Transactions(); void Show(); // Показать };
Как в подобном случае указать классу нужную реализацию метода? Такая задача решается благодаря использованию имени интерфейса вместе с именем реализуемого метода, как это продемонстрировано на примере программы Ambiguous (Неоднозначная программа). Версия метода Show (Показать), относящаяся к интерфейсу lAccount, выводит на экран информацию только о состоянии счета, а метод IStatement::Show (Показать) выводит число сделок и баланс.
//Account.h _gc class Account: public lAccount, public IStatement // класс сборщика мусора Счет { private: // частный Decimal decBalance; // Десятичное число int nNumXact; public: Account(Decimal decBalance): nNumXact(O) // Счет (Десятичное число decBalance) { this › decBalance = decBalance; } void Deposit(Decimal decAmount) // Депозит (Десятичное число decAmount) { decBalance = decBalance + decAmount; ++nNumXact; } void Withdraw(Decimal decAmount) // Снять (Десятичное // число decAmount) { decBalance = decBalance – decAmount; ++nNumXact; } _property Decimal get_Balance() // Десятичное число { return decBalance; } void lAccount::Show() // Показать { Console::WriteLine( "balance = {0}", _box(decBalance)); // баланс } _property int get_Transactions() { return nNumXact; } void IStatement::Show() // Показать { Console::WriteLine( "{0} transactions, balance = {!}", // сделки, баланс _box(nNumXact), _box(decBalance)); } };