C#

Рекламный модуль
Polashop.ru: чемодан на колесах купить или рюкзак можно здесь.

Подробнее о ключевом слове 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 ;.:.= :бъектов", поскольку там оно используется тоже.