Добавление методов и изменение методов родителя

Потомок может добавлять новые собственные методы.

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

· перегрузка метода. Она возникает, когда сигнатура создаваемого метода отличается от сигнатуры наследуемых методов предков. В этом случае в классе потомка будет несколько перегруженных методов с одним именем, и вызов нужного метода определяется обычными правилами перегрузки методов;

· переопределение метода. Метод родителя в этом случае должен иметь модификатор virtual или abstract. При переопределении сохраняется сигнатура и модификаторы доступа наследуемого метода;

· скрытие метода. Если родительский метод не является виртуальным или абстрактным, то потомок может создать новый метод с тем же именем и той же сигнатурой, скрыв родительский метод в данном контексте. При вызове метода предпочтение будет отдаваться методу потомка, а имя наследуемого метода будет скрыто. Это не означает, что оно становится недоступным. Скрытый родительский метод всегда может быть вызван, если при вызове уточнить ключевым словом base. Имя_метода.

Метод потомка, скрывающий метод родителя, следует сопровождать модификатором new, указывающим на новый метод.

 

// Программа 4. Класс наследник с переопределенными методами родителя

public class Derived:Found {

protected int debet;

public Derived() {}

public Derived(String^ name, int cred, int deb): Found (name,cred){

debet = deb;

}

public void DerivedMethod(){ //новый метод потомка

Console.WriteLine("Это метод класса Derived");

}

new public void Analysis(){ //сокрытие метода родителя

base.Analysis();

Console.WriteLine("Сложный анализ");

}

public void Analysis(int level){ // перегрузка метода

base.Analysis();

Console.WriteLine("Анализ глубины {0}", level);

}

public override String^ ToString(){ //переопределение метода

return(String.Format("поля: name = {0}, credit = {1},debet ={2}",name, credit, debet));

}

public override void VirtMethod() { // переопределение метода родителя

Console.WriteLine ("Сын: " + this.ToString());

} }

Статическое и динамическое связывание

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

Динамическим связыванием называется связывание цели вызова и вызываемого метода на этапе выполнения, когда с сущностью связывается метод класса объекта, связанного с сущностью в момент выполнения.

В языке C# принята следующая стратегия связывания. По умолчанию предполагается статическое связывание. Для того чтобы выполнялось динамическое связывание, метод родительского класса должен снабжаться модификатором virtual или abstract, а его потомки должны иметь модификатор override.

 

Интерфейсы

Интерфейс представляет собой полностью абстрактный класс, все методы которого абстрактны. Методы интерфейса объявляются без указания модификатора доступа. Класс, наследующий интерфейс, обязан полностью реализовать все методы интерфейса.

В языке C# полного множественного наследования классов нет. Чтобы частично сгладить этот пробел, допускается множественное наследованиеинтерфейсов. Обеспечить возможность классу иметь несколько родителей - один полноценный класс, а остальные в виде интерфейсов, - в этом и состоит основное назначение интерфейсов.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: