Общие сведения о полиморфизме 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Общие сведения о полиморфизме



Если производный класс наследует от базового класса, то он приобретает все методы, поля, свойства и события базового класса. Существует два подхода к изменению данных и поведения базового класса: можно заместить член базового класса новым производным членом или можно переопределить виртуальный член базового класса.

Замена члена базового класса на новый член производного класса требует использования ключевого слова new. Если в базовом классе определен метод, поле или свойство, то ключевое слово new используется для создания нового определения этого метода, поля или свойства в производном классе. Ключевое слово new располагается перед возвращаемым типом замещаемого члена класса. Например:

ß-----


When the new keyword is used, the new class members are called instead of the base class members that have been replaced. Those base class members are called hidden members. Hidden class members can still be called if an instance of the derived class is cast to an instance of the base class. For example:

DerivedClass B = new DerivedClass(); B.DoWork(); // Calls the new method.   BaseClass A = (BaseClass)B; A.DoWork(); // Calls the old method.

In order for an instance of a derived class to completely take over a class member from a base class, the base class has to declare that member as virtual. This is accomplished by adding the virtual keyword before the return type of the member. A derived class then has the option of using the override keyword, instead of new, to replace the base class implementation with its own. For example:

public class BaseClass { public virtual void DoWork() { } public virtual int WorkProperty { get { return 0; } } } public class DerivedClass: BaseClass { public override void DoWork() { } public override int WorkProperty { get { return 0; } } }

Fields cannot be virtual; only methods, properties, events and indexers can be virtual. When a derived class overrides a virtual member, that member is called even when an instance of that class is being accessed as an instance of the base class. For example:

DerivedClass B = new DerivedClass(); B.DoWork(); // Calls the new method.   BaseClass A = (BaseClass)B; A.DoWork(); // Also calls the new method.

В случае использования ключевого слова new вместо членов базового класса, которые были замещены, вызываются члены нового класса. Эти члены базового класса называются скрытыми членами. Скрытые члены класса могут быть вызваны в том случае, если экземпляр производного класса будет приведен к экземпляру базового класса. Например:

ß---

Чтобы экземпляр производного класса полностью заменил член базового класса, данный член должен быть объявлен в базовом классе как виртуальный. Это выполняется путем добавления ключевого слова virtual перед возвращаемым типом члена класса. В производном классе затем можно использовать ключевое слово override вместо ключевого слова new, чтобы заместить реализацию базового класса своей собственной. Например:

 

ß------

 

Поля не могут быть виртуальными. Виртуальными могут быть только методы, свойства, события и индексаторы. Если в производном классе виртуальный метод переопределяется, то этот член вызывается даже в том случае, если доступ к экземпляру этого класса осуществляется как к экземпляру базового класса. Например:

ß-----


Virtual methods and properties enable you to plan ahead for future expansion. Because a virtual member is called regardless of which type the caller is using, it gives derived classes the option to change the apparent behavior of the base class.

Virtual members remain virtual indefinitely, regardless of how many classes have been declared between the class that originally declared the virtual member. If class A declares a virtual member, and class B derives from A, and class C derives from B, class C inherits the virtual member, and has the option to override it, regardless of whether class B declared an override for that member. For example:

public class A { public virtual void DoWork() { } } public class B: A { public override void DoWork() { } }
public class C: B { public override void DoWork() { } }

A derived class can stop virtual inheritance by declaring an override as sealed. This requires putting the sealed keyword before the override keyword in the class member declaration. For example:

public class C: B { public sealed override void DoWork() { } }

Виртуальные методы и свойства позволяют заранее планировать будущее расширение. Так как виртуальный член вызывается независимо от того, какой тип используется вызывающим объектом, это дает возможность производным классам изменять очевидное поведение базового класса.

Виртуальные члены остаются виртуальными без каких-либо ограничений в отношении количества классов, объявленных между объявляемым классом и классом, в котором эти виртуальные члены были изначально объявлены. Если в классе A объявляется виртуальный член и класс B является производным от класса A, а класс C является производным от класса B, то класс C наследует виртуальный член и обеспечивает возможность его переопределения независимо от того, было ли в классе B объявлено переопределение этого члена. Например:

ß---

 

Производный класс может прекратить наследование виртуального члена, объявив переопределенный член закрытым. Для этого нужно добавить ключевое слово sealed перед ключевым словом override в объявлении члена класса. Например:

ß----


In the previous example, the method DoWork is no longer virtual to any class derived from C. It is still virtual for instances of C, even if they are cast to type B or type A. Sealed methods can be replaced by derived classes by using the new keyword, as the following example shows:

public class D: C { public new void DoWork() { } }

In this case, if DoWork is called on D using a variable of type D, the new DoWork is called. If a variable of type C, B, or A is used to access an instance of D, a call to DoWork will follow the rules of virtual inheritance, routing those calls to the implementation of DoWork on class C.

A derived class that has replaced or overridden a method or property can still access the method or property on the base class using the base keyword. For example:

public class A { public virtual void DoWork() { } } public class B: A { public override void DoWork() { } }
public class C: B { public override void DoWork() { // Call DoWork on B to get B's behavior: base.DoWork();   // DoWork behavior specific to C goes here: //... } }
Note:
It is recommended that virtual members use base to call the base class implementation of that member in their own implementation. Letting the base class behavior occur enables the derived class to concentrate on implementing behavior specific to the derived class. If the base class implementation is not called, it is up to the derived class to make their behavior compatible with the behavior of the base class.

В предыдущем примере метод DoWork больше не является виртуальным для любого производного от класса C класса. Он остается виртуальным для экземпляров класса C, даже если они приведены к типу B или A. Закрытые методы можно замещать в производных классах с помощью ключевого слова new, как показано в следующем примере:

ß---

В этом случае при вызове метода DoWork для типа D с использованием переменной типа D вызывается новый метод DoWork. Если для доступа к экземпляру типа D используется переменная типа C, B или A, то вызов метода DoWork будет подчиняться правилам виртуального наследования, направляя вызовы реализации метода DoWork в классе C.

Производный класс с замещенным или переопределенным методом или свойством сохраняет доступ к методу или свойству базового класса с помощью ключевого слова base. Например:

ß----

 

Примечание.
Для вызова реализации виртуального члена из базового класса в собственной реализации рекомендуется использовать с такими членами ключевое слово base. Сохранение поведения базового класса позволяет сосредоточиться в производном классе на реализации поведения, специфического для этого производного класса. Если реализация базового класса не вызывается, то совместимость поведения членов производного класса с поведением членов базового класса зависит от производного класса.

 



Поделиться:


Последнее изменение этой страницы: 2017-01-19; просмотров: 94; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.12.108.236 (0.008 с.)