Успадкування та модифікатори області видимості в додатку обміну валют в Visual C # (Sharp)

На даному етапі властивість ExchangeRate є механічним властивістю, º ться буде використовуватися будь-якою похідним класом класу CurrencyTrader Тому зараз нам потрібно вирішити, чи слід обмежувати доступ до цього свотву Правильним рішенням буде дозволити доступ до нього тільки тим разрабоікам, які дійсно розуміють механізм перетворення валют Доступ повинен бути обмежений класами, похідними від класу CurrencyTrader Міфіцірованний клас CurrencyTrader буде виглядати таким чином:

public abstract class CurrencyTrader {

private double _exchangeRate

protected double ExchangeRate { get {

return _exchangeRate

}

set {

_exchangeRate = value

}

&gt&nbsp

}

Жирним шрифтом в цьому коді виділені визначення областей видимості

• public (загальна) – до даного типу, методу або властивості може звертатися і мати доступ будь-який інший тип За аналогією з квартирою та відвідувачами, це буде те саме вітальні, в яку практично будь ваш відвідувач може мати доступ

• private (приватна) – до даного методу або властивості може звертатися і мати доступ тільки тип, який його оголосив За аналогією з квартирою і посетітямі, це буде те саме вашій спальні, в яку доступ маєте тільки ви

• protected (захищена) – до методу або властивості може звертатися і мати доступ тип, який його оголосив, або похідні типи За аналогією з квартою та відвідувачами, це буде те саме вашої їдальні, в яку доступ маєте ви та запрошені вами гості

Типу, методу або властивості, оголошеному без вказівки області видимості, за замовчуванням присвоюється приватна область видимості

Модифікатори private і protected не можна присвоювати типам Додаткова інформація про інших модифікаторах і подробиці про оголошеннях області вімості типу буде розглянута в наступному розділі

Використання успадкування для створення іншого типу

Модифікована версія класу CurrencyTrader виведе з ладу тестовий код, т к в ньому використовується ключове слово abstract, а з абстрактних типів створити екземпляри безпосередньо не можна Ось код, який не буде працювати: CurrencyTrader els = new CurrencyTrader ()

elsExchangeRate = 12344

Код не працюватиме з двох причин:

• клас CurrencyTrader є абстрактним і тому не допускає непосретвенного створення примірників

• властивість ExchangeRate є захищеним і тому не допускає звернуся ззовні

Це ставить нас в скрутне становище До теперішнього моменту при тестуванні коду ми вважали, що всі фрагменти, що підлягають тестуванню, були достуимі Одним з рішень цієї проблеми було б змінити оголошення областей видимості і видалити ключові слова abstract і protected Але, в той час як тієї підхід вирішив би проблему, це було б компромісом Кращим підходом буде протестувати клас CurrencyTrader в тому вигляді, в якому його подразевалось використовувати, тобто як наслідуваний клас Таким чином, рішенням буде застосувати механізм успадкування та створити похідний від класу CurrencyTrader тестовий клас TestCurrencyTrader наступним чином:

class TestCurrencyTrader:CurrencyTrader { public void InitializeExchangeRate() {

ExchangeRate = 1000

}

}

Тестовий клас TestCurrencyTrader додається до вихідного коду Ідентіфікор успадкованого класу (TestCurrencyTrader) відділяється від ідентифікатора класу, від якого ОН успадковує (CurrencyTrader) за допомогою двокрапки

Щоб надати доступ до методу зовнішньому коду, застосовується модифікатор

public, хоча сам клас public не оголошений

До ідентифікаторам базового класу, область видимості яких оголошено protected або public, можна звертатися з похідного класу Наприклад, оатіте увагу на те, що змінна ExcahngeRate використовується самостійний, без посилань на обєкт Таке звернення до змінної ExcahngeRate цілком

нормально, т к в базовому класі currencyTrader мається ідентифікатор з таким імям До властивості ExchangeRate можна звертатися локально, т к воно має оасть видимості protected Ідентифікатор ExchangeRate увазі посилання this (тобто this ExchangeRate), тому немає потреби додавати це посилання явно, якщо тільки не є декілька однакових ідентифікаторів або ви не хочете явно звернутися до певного ідентифікатором

Тепер наші тести не зможуть тестувати клас CurrencyTrader, але зможуть Тестовано клас TestcurrencyTrader Останній повинен містити код для веріфаціі, що все працює належним чином

Області видимості private, protected і public

Тепер розглянемо більш докладно роботу цих трьох типів області видимості Для початку, обговоримо реалізацію класу 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

}

}

Від класу CurrencyTrade успадковується НОВИЙ клас ActiveCurrencyTrader таким чином:

public class ActiveCurrencyTrader : CurrencyTrader {

}

Так як член даних CurrencyTrader, _exchangeRate оголошений private, ТО обраться до нього можна тільки з класу CurrencyTrader Якби для нього не була явно оголошена область видимості, то область видимості private мається на увазі лась би неявно Наприклад, наступний коду не скомпилірувався б:

public class ActiveCurrencyTrader : CurrencyTrader { public void Method() {

_exchangeRate = 1000

}

}

Клас ActiveCurrencyTrader не є частиною класу CurrencyTrader, І тому звернення до члена даних _exchangeRate неможливо

У класі ActiveCurrencyTrader До члену даних ExchangeRate, який був обвлен protected, можна звертатися таким чином:

public class ActiveCurrencyTrader : CurrencyTrader { public void Method() {

ExchangeRate = 1000

}

}

Область видимості protected означає, що тільки класи, успадковані від базого класу, можуть звертатися до методів, властивостями або членам даних з даною галуззю видимості Кількість наслідувань і рівень спадкування проізвоітся класу ролі не грають

З усіх областей видимості public є найбільш що дозволяє і простою Вона застосовується, коли потрібно надати функціональність, до якої требт доступу інші класи або похідні класи даного класу

Далі наводяться деякі поради з використання кожної області видимості

•&nbsp&nbsp Область видимості private (Приватна) Застосовується для більшості членів даних, т к члени даних неявно висловлюють стан обєкта Іноді рабую логіку розроблюваного алгоритму необхідно розбити на кілька модів Так як окремі методи застосовуються для вирішення однієї і тієї ж зачі, то їх необхідно використовувати тільки в контексті класу, що означає, що їх область видимості необхідно оголосити private

•&nbsp&nbsp Область видимості protected (Захищена) Застосовується, коли необхідно забезпечити дотримання архітектури успадкування Дуже часто ключові сла protected і abstract застосовуються спільно, т к обидва призначені для використання з механізмом успадкування Основною метою застосування оасті видимості protected є надання похідному класу доупі до приватного станом батьківського класу або надання функціальності багаторазового використання, користуватися якою можуть тільки досвідчені розробники

•&nbsp&nbsp Область видимості public (Загальна) Подумайте гарненько, перш ніж пренять цю область видимості Дана область видимості є найбільш використовуваною, але в той же самий час може бути причиною більшості прлем Наприклад, після оголошення якого елемента public подальша спроба змінити область видимості може привести в повний безлад код, що використовує даний елемент Застосування інших областей видимості може дещо утруднити процес розробки, але дозволить отримати більш

надійний код з точки зору підтримки У кінцевому рахунку, рішення, яку область видимості застосувати, приймається на основі того, які методи і властивості необхідно надати зовнішньому коду

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*