C#

Рекламный модуль
перетяжка мебели киев | Доставка питьевой воды производится водителем-экспедитором.

Понятие наследования и модификаторов области видимости

В настоящий момент свойство ExchangeRate — чисто механическое, его может ис-тктьзовать любой класс, производный от класса CurrencyTrader. Теперь необходимо :-erjHTb, следует ли ограничить доступ к этому свойству. Его следует ограничить только теми разработчиками, кто правильно понимают, как преобразовать валюты. Таким образом, доступ должен быть ограничен теми классами, которые будут производными от класса CurrenoyTrader. Вот переписанная версия класса CurrencyTrader. public abstract class CurrencyTrader { private double _exchangeRate; protected double ExchangeRate { get { return _exchangeRate; } set { _exchangeRate = value; } ) } Код, выделенный полужирным шрифтом, — это примеры трех областей видимости. • public (открытый). К такому типу, методу или свойству может обращаться любой другой тип. В бытовом контексте это значит, что проверять ваш бумажник может любой. • private (закрытый). К такому методу или свойству может обращаться только тот тип, в котором этот метод или свойство объявлены. В бытовом контексте это зна¬чит, что ваш бумажник доступен только вам. • protected (защищенный). К такому методу или свойству может обращаться толь¬ко тот тип, который является производным от данного. В бытовом контексте это значит, что в ваш бумажник могут заглядывать только ваши дети. Если вы объявляете тип, метод или свойство без модификатора области видимости, то по умолчанию он считается закрытым. Модификаторы private и protected нельзя присвоить типу. Более подробная ин¬формация о других модификаторах и подробности объявлений с использованием об¬ласти видимости приведена в следующей главе. Использование наследования С# для создания производного класса Переписанная версия класса CurrencyTrader нарушит проверочный код, поскольку она использует ключевое слово abstract, а создать экземпляр абстрактного типа непо¬средственно нельзя. Вот сбойный код: CurrencyTrader els = new CurrencyTrader(); els.ExchangeRate = 123.44; Этот код не будет работать по двум причинам. • Класс CurrencyTrader абстрактный, поэтому создать его экземпляр нельзя. • Свойство ExchangeRate защищенное, к нему нельзя обратиться извне. Этот сбойный код связывает нам руки. До сих пор, когда мы проверяли код, мы под¬разумевали, что все проверяемые элементы доступны. Одно из решений заключалось бы в изменении объявления области видимости и удалении ключевых слов abstract и protected. Но лучший подход подразумевал бы проверку класса CurrencyTrader так. как он будет использоваться, т.е. как класс, производный от чего-нибудь. Решение за¬ключается в использовании наследования и создании проверочного класса, произво¬дного от класса CurrencyTrader, следующим образом: class TestCurrencyTrader : CurrencyTrader public void InitializeExchangeRate () ExchangeRate = 100.0; Класс TestCurrencyTrader — это проверочный класс, который добавлен в исхо-Ю ый код проверки. Двоеточие (:) отделяет идентификатор класса от идентификатора К :изводного класса, CurrencyTrader. Чтобы предоставить метод вовне объявления свеса, вы используете модификатор public, даже при том, что у класса нет модифи-":-т:ра public. Наследование подразумевает, что идентификаторы с областью видимости protected * exilic становятся доступными в производном типе. Обратите, например, внимание ::. как все в классе ExchangeRate кажется собственным, безо всяких ссылок на (Нэекты. Единая ссылка на класс ExchangeRate прекрасна, поскольку базовый класс -rrer.cyTrader имеет идентификатор с тем же именем. К свойству ExchangeRate - но обращаться локально из-за его области видимости protected. Идентификатор "ar.geRate имеет ссылку this (this .ExchangeRate). В принципе, нет необходимости I 5авлять ее, если вы не имеете нескольких идентификаторов с одинаковым именем, - е можно использовать для явной ссылки на некий идентификатор. Теперь проверка не будет проверять класс CurrencyTrader, она проверяет класс - =- CurrencyTrader, который должен содержать некоторый код верификации, чтобы 1 етсвериться в правильности работы. п:чятие закрытой, защищенной и открытой областей видимости _.авайте немного глубже рассмотрим то, как работают три типа областей видимости. зачала рассмотрим реализацию класса 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; Новый класс, ActiveCurrencyTrader, — это класс, производный от класса Currency-э=г. он объявлен следующим образом: public class ActiveCurrencyTrader : CurrencyTrader { } Переменная-член CurrencyTrader ._exchangeRate объявлена как private, а сле¬довательно, доступна только в классе CurrencyTrader. Если бы переменная-член _exchangeRate не имела объявления, то подразумевалась бы закрытая область видимо¬сти. Следующий код, например, не компилировался бы: public class ActiveCurrencyTrader : CurrencyTrader { public void Method () { _exchangeRate = 100.0; } } Класс ActiveCurrencyTrader не является частью класса CurrencyTrader, таким об¬разом переменная-член _exchangeRate недоступна. Рассматривая класс ActiveCurrencyTrader, можно заметить, что переменная-член ExchangeRate была объявлена как protected, к ней можно обратится следующим образом: public class ActiveCurrencyTrader : CurrencyTrader ( public void Method!) { ExchangeRate = 100.0; } ) Защищенная область видимости означает, что просматривать методы, свойства или переменные-члены могут только те классы, которые происходят от данного класса. Неважно, сколько раз и какого уровня потомком является класс. Открытая область видимости самая простая и свободная изо всех областей види¬мости. Вы используете ее всякий раз, когда хотите предоставить функциональные воз¬можности другим классам или производным классам. Имеются некоторые правила использования каждой из областей^зидимости. • Закрытая область видимости (private scope). Вы используете ключевое слово private при объявлении большинства переменных-членов, поскольку объявле¬ния переменных-членов определяют состояние объекта. Иногда, при разработ¬ке алгоритмов, вы разделяете логику на несколько методов. Разделение методов используется для решения некоторых проблем и, таким образом, должно ис¬пользоваться только в контексте класса, подразумевая, что методы должны быть объявлены как private. • Защищенная область видимости (protected scope). Вы используете ключевое слово protected всякий раз, когда хотите задать архитектуру наследования. Зачастую ключевые слова protected и abstract используются вместе, поскольку оба отно¬сятся к наследованию. Основная задача ключевого слова protected — предоста¬вить производному классу доступ к закрытому состоянию родительского класса или предоставить ему функции многократного использования, которые должны использоваться только теми, кто разбирается в них. • Открытая область видимости (public scope). Нужно очень хорошо подумать, прежде чем использовать ключевое слово public. Открытую область видимости можно использовать во многих ситуациях, но она создает больше проблем, чем область видимости private или protected. Например, если вы объявили нечто как public, а затем изменили область видимости, то код, использующий класс, может быть нарушен. При использовании других областей видимости разработка может оказаться тяжелее, но вы будете иметь код, создающий меньше проблем при обслуживании. Здесь все сводится к тому, какие методы и свойства вы хотите предоставить внешнему миру.