Подробнее о ключевом слове abstract
В примере этой главы ключевое слово abstract использовалось при объявлении - моторому можно обратиться, но экземпляр которого нельзя создать. Ключевое :street можно также использовать при определении методов, которые пред-:с^тизовать. Основная причина объявления методов абстрактными заключается п :оы позволить другим разработчикам определить намерение в базовом классе,
"удет затем реализовано в производном классе. с "-Изации классов HotelCurrencyTrader и ActiveCurrencyTrader были определе-етода — ConvertTo () и ConvertFrom (). Разработчик мог бы прийти к выводу, с.;- :етоды общие для обоих классов, их следовало бы определить в базовом классе,
CurrencyTrader. Это неплохая идея. Давайте вернемся к классу CurrencyTrader и г смотрим, как добавить в него эти два метода в качестве абстрактных.
public abstract class CurrencyTrader { private double _exchangeRate; protected double ExchangeRate { get {
return _exchangeRate; )
set {
_exchangeRate = value; }
protected double ConvertValue(double input)
return _exchangeRate * input; protected double ConvertValuelnverse (double input)
return input / _exchangeRate;
public abstract double ConvertTo(double value); public abstract double ConvertFrom(double value);
}
Абстрактные методы объявляют без реализации, а содержащий их класс долая ■ быть объявлен как абстрактный.
Каждый класс, производный от класса CurrencyTrader, обязан реализовать методы ConvertTo () и ConvertFrom () . В случае классов HotelCurrencyTra ;•= _ и ActiveCurrencyTrader это не проблема, поскольку методы уже реализованы. Одна:-, методы следует немного изменить так.
public override double ConvertTo(double value) {
// ... }
public override double ConvertFrom (double value) {
// ... }
Небольшое изменение — это добавление ключевого слова override, указыва:-щее на то, что методы ConvertTo () и ConvertFrom () в классах HotelCurrencyTra;е: и ActiveCurrencyTrader переопределяют функции в классе CurrencyTrader.
Хотя технические аспекты мы рассмотрели, остается вопрос, зачем это делагп Давайте вернемся к реализации класса ActiveCurrencyTrader, который не имеет ниш* ких реализаций абстрактных методов. Чтобы использовать класс и метод Convert,: вы написали бы следующий код:
ActiveCurrencyTrader els = new ActiveCurrencyTrader(); double converted = els.ConvertTo( 100.0);
Представьте ситуацию, при которой значения преобразуются в текст и обратно. Чтобы оставить вещи общими, вы могли написать следующий код:
T1Z--Z double ConvertToTextField(ActiveCurrencyTrader els) return cls.ConvertTo(int.Parse (textl.Text));
- -ТАзацяя метода ConvertToTextField () имеет одну серьезную ошибку — она под-
-:-;ает, что вы всегда будете конвертировать валюту, используя реализацию клас-
■ .veCurrencyTrader. Если вы захотите использовать класс HotelCurrencyTrader,
придется реализовать другой метод с параметром типа HotelCurrencyTrader.
:-лассическая проблема полиморфизма (polymorphism) и решается она абстракт-
:етодами. Рассмотрим следующий переделанный метод ConvertToTextField О .
...:-_; iouble ConvertToTextField (CurrencyTrader els) return els.ConvertTo(int.Parse(textl.Text));
реализация метода ConvertToTextField () использует базовый класс
- ;yTrader, а следовательно, методы ConvertToO и ConvertFrom () объявлены
ШШгт ~-гыми. Щ
■особы вызова метода ConvertToTextField () и создания экземпляров классов slTurrencyTrader и ActiveCurrencyTrader не рассматриваются в этой главе, по-'ш.-гь:--,- полиморфизм — это тема следующей главы. Имейте только в виду, более под¬ии- '=.-. информация о ключевом слове abstract приведена в главе 7, "Компоненты и ие-II ;.:.= :бъектов", поскольку там оно используется тоже.