Потомок может добавлять новые собственные методы.
В отличие от неизменяемых полей классов - предков, класс - потомок может изменять наследуемые им методы. Если потомок создает метод с именем, совпадающим с именем метода предков, то возможны три ситуации:
· перегрузка метода. Она возникает, когда сигнатура создаваемого метода отличается от сигнатуры наследуемых методов предков. В этом случае в классе потомка будет несколько перегруженных методов с одним именем, и вызов нужного метода определяется обычными правилами перегрузки методов;
· переопределение метода. Метод родителя в этом случае должен иметь модификатор 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# полного множественного наследования классов нет. Чтобы частично сгладить этот пробел, допускается множественное наследованиеинтерфейсов. Обеспечить возможность классу иметь несколько родителей - один полноценный класс, а остальные в виде интерфейсов, - в этом и состоит основное назначение интерфейсов.