Додаткові відомості про спадкування і приведення типів в Visual C # (Sharp)

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

У даному розділі ми розглянемо в деталях механізм роботи спадкування в С # Для цього будуть надані сім сценаріїв використання успадкування Пле кожного прикладу дається пояснення ключових аспектів, що демонструються в даному сценарії Демонстрація всіх цих можливих сценаріїв повинна дати вам гарне уявлення про механізм роботи успадкування

ПРИМІТКА

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

i Сценарій 71 Перевантаження функціональності базового класу

class Base {

public void Method() { ConsoleWriteLine(&quotBaseMethod&quot)

}

}

class Derived : Base { public new void Method() {

ConsoleWriteLine(&quotDerivedMethod&quot)

}

}

class Test {

public static void Run() {

Derived derivedCls = new Derived() Base baseCls = derivedCls

/ / Викликаємо метод DerivedMethod derivedClsMethod ()

/ / Викликаємо метод BaseMethod baseClsMethod ()

}

}

У даному сценарії використовується ключове слово new, щоб вказати перевантаження методу Перевантаження методу означає зміну його функціональності в проізвоітся класі

Виклик конкретного методу у спадкуванні залежить від типу обєкта, в якому викликається метод Таким чином, для змінної типу Base викликається метод BaseMethod (), а ДЛЯ змінного типу Derived – метод DerivedMethod()

Сценарій 72 Перевантаження функціональності базового класу

class Base {

public virtual void Method() { ConsoleWriteLinef&quotBaseMethod&quot)

}

}

class Derived : Base {

public override void Method() { ConsoleWriteLine(&quotDerivedMethod&quot)

}

}

class Test {

public static void Run() {

Derived derivedCls = new Derivedf) Base baseCls = derivedCls

/ / Викликаємо метод DerivedMethod derivedClsMethod ()

/ / Викликаємо метод DerivedMethod baseClsMethod ()

}

}

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

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

Метод віртуального базового класу можна також оголосити за допомогою ключового слова abstract Різниця між virtual і abstract полягає в тому, що virtual має реалізацію методу або властивості, в той час як abstract такої реалізації не має

Сценарій 73 Реалізація інтерфейсу

interface Ilnterface { void Method()

}

class Implementation : Ilnterface { public void Methodf) {

ConsoleWriteLine(&quotImplementationMethod&quot)

}

}

class Test {

public static void Run()   {

Implementation implementation = new Implementation() Ilnterface inst = implementation

/ / Викликаємо метод ImplementationMethod implementationMethod ()

/ / Викликаємо метод ImplementationMethod instMethodf)

}

}

Розглянуті е ключову е слів а н е використовуються

Поведінкою е класу, реалізующег про інтерфейс, подібний про похідний го класу, реалі – зующей у абстрактні й метод

Незалежний про о т того, обращаемс я л і м и до екземпляр у інтерфейс а мул і до самому го класу, визиваетс я мето д ImplementationMethodf)

Сценарій 74 Реалізація двох інтерфейсів з однаковим імям методу або властивості

interface Ilnterfacel { void Method()

}

interface Ilnterface2 { void Methodf)

}

class Implementation : Ilnterfacel, Ilnterface2 { void IlnterfacelMethodf) {

ConsoleWriteLine(&quotImplementationIlnterfacelMethod&quot)

}

void IInterface2Methodf) { ConsoleWriteLine(&quotImplementationIlnterfacelMethod&quot)

}

}

class Test {

public static void Run() {

Implementation implementation = new Implementation() Ilnterfacel instl = implementation

Ilnterfacel inst2 = implementation

/ / Метод implementationIlnterfacelMethod () не можна викликати

/ / Викликаємо метод ImplementationIlnterfacelMethod instlMethod ()

/ / Викликаємо ImplementationIlnterface2Method inst2Method ()

}

}

У цьому методі застосовується спеціальна нотація для реалізації певного метод а інтерфейс а (наприклад, Ilnterfacel Method () І IInterface2 Method ())

Спеціальна нотація полягає у вказівці ідентифікатора інтерфейсу перед імем методу Перед методом не можна вказувати ідентифікатор області видимості, т к метод повинен бути приватним для даного класу

Методи не можна викликати як стандартні методи класу Це можна робити, толо виконавши приведення типу до відповідного інтерфейсу Додаткові подробиці про приведення типів обговорюються в наступному розділі

При реалізації двох інтерфейсів з однаковим імям методу або властивості застосування даної нотації не є обовязковим Можна використовувати обвленіе методу MethodO, як в попередніх прикладах, за винятком того, що для кожного інтерфейсу викликається один і той же метод або властивість

Сценарій 75 Реалізація інтерфейсу в похідному класі

interface Ilnterface { void Methodf)

}

class Baselmplementation { public void MethodO {

ConsoleWriteLinef&quotImplementationMethod&quot)

}

}

class implementationDerived : Baselmplementation, Ilnterface {

}

class Test {

public static void Run Про {

ImplementationDerived implementation = new ImplementationDerived)

Ilnterface inst = implementation

/ / Викликаємо метод ImplementationMethod implementationMethod ()

I Викликаємо ImplementationMethod instMethodf)

}

}

Розглянуті е ключову е слів а н е використовуються

Пр і реализаци і інтерфейс а н е обовязково, щоб и Базовим й клас з являлс я подклас – зі м інтерфейсу Базовим й клас з можн про визначить ь з відповідним і сигнатурою – рам і метод а і властивості Пр і пошук е соответствующи х методо в і свойст в у вироб – водно м клас е компілято р С # проглядається т НД ю ієрархи ю успадкування

Есл і н е соблюдат ь обережну ь з Підміна й і перевантаження й методів, т о це т спо – зі б Може т визват ь дивні е побічні е ефекти

Сценарій 7,6 Реалізація інтерфейсу, що дозволяє підміну

interface Ilnterface { void Method()

}

class Implementation : Ilnterface { public virtual void Method() {

ConsoleWriteLine(&quotImplementationMethod&quot)

}

}

class implementationDerived : Implementation { public override void Method() {

ConsoleWriteLine(&quotImplementationDerivedMethod&quot)

}

}

class Test {

public static void Run() {

ImplementationDerived implementation = new ImplementationDerived() Ilnterface inst = implementation

/ / Викликаємо метод ImplementationDerivedMethod implementationMethod ()

/ / Викликаємо метод ImplementationDerivedMethod instMethod ()

}

}

У данно м сценарі і застосовуються тільки я ключову е слів а virtual і override

П про умовчання ю реализаци я інтерфейс а бе з применени я ключевог про слів а virtual означає, чт про похідні й клас з Може т підмінять ь тольк про метод В о многи х випад – я х пов про являетс я адекватні м поведінкою, т к м и хоти м перевантажить ь мето д і тому – му на м нужн про іспользоват ь ключову е слів а virtual і override

Ет про распространенна я проблема, і поведін е перевантаження і приводь т більшостей про начинающ х програмістом в С # в замішання

Сценарій 77 Дерево успадкування з підміною і перевантаженням

class Base {

public virtual void Method() { ConsoleWriteLine(&quotBaseMethod&quot)

}

}

class Derivedl : Base {

public override void Method() { ConsoleWriteLine(&quotDerivedlMethod&quot)

}

}

class Derived2 : Derivedl {

public new virtual void MethodO { ConsoleWriteLine(&quotDerived2Method&quot)

}

}

class Derived3 : Derived2 {

public new virtual void MethodO { ConsoleWriteLine(&quotDerived3Method&quot)

}

}

class Test {

public static void Run() {

Derived3 derivedCls = new Derived3() Base baseCls = derivedCls

Derived2 derived2cls = derivedCls

/ / Викликаємо метод Derived3Method derivedClsMethod ()

/ / Викликаємо метод DerivedMethod baseClsMethodO

/ / Викликаємо метод Derived3Method derived2clsMethodf)

}

}

У цьому сценарії застосовуються ключові слова virtual, override і new –

Дана ієрархія спадкоємства викликає труднощі у більшості программтовС #і вимагає уважного ставлення

Представлена ​​ієрархія спадкоємства вказує, що метод Derivedi Method () підміняє метод BaseMethod () Метод Derived2Method () перевантажує метод Derivedi Method (), при цьому встановлюючи новий подменяющий базовий метод Метод Derived3 Method () підміняє метод Derived2 Method (), АЛЕ не метод Base Method (), що дуже важливо мати на увазі

При роботі зі складною ієрархією успадкування, подібної показаної в сцені 77, важливо починати з базового класу і просуватися вгору по ієрархії

Джерело: Гросс К С # 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>

*

*