Во-первых, обратите внимание на использование ключевого слова new при объявлении члена i в классе в. По сути, он сообщает компилятору о том, что вы знаете, что создается новая переменная с именем i, которая скрывает переменную i в базовом классе А. Если убрать слово new, компилятор сгенерирует предупреждающее сообщение.Результаты выполнения этой программы выглядят так: /
I Член i в производном классе: 2
Поскольку в классе в определяется собственная переменная экземпляра с именем
i , она скрывает переменную i, определенную в классе А. Следовательно, при вызове
метода show() для объекта типа в, отображается значение переменной для б, а не для а
Использование ключевого слова base для доступа к скрытому имени.Существует вторая форма использования ключевого слова base, которая действуетподобно ссылке this, за исключением того, что ссылка base всегда указывает на базовый класс производного класса, в котором она используется. В этом случае форматее записи такой: base.членЗдесь в качестве элемента член можно указывать либо метод, либо переменнуюэкземпляра. Эта форма ссылки base наиболее применима в тех случаях, когда имячлена в производном классе скрывает член с таким же именем в базовом классе. Рассмотрим следующую версию иерархии классов из предыдущего примера:
// Использование ссылки base для доступа к скрытому имени.
using System;
class A { public int i = 0; }
// Создаем производный класс,
class В : А { new int i; // Эта переменная i скрывает i класса А.
publicВ(int a, int b) { ! base.i = а; // Так можно обратиться к i класса А.
i = b; // Переменная i в классе В. }
public void show() {
// Эта инструкция отображает переменную i в классе А.
Console.WriteLine("i в базовом классе: " + base.i);
// Эта инструкция отображает переменную i в классе В.
Console.WriteLine("i в производном классе: " + i );
class UncoverName { public static void Main() {
В ob = new В(1f 2 );
ob.show();
Результаты выполнения этой программы выглядят так: i в базовом классе: 1
i в производном классе: 2 Несмотря на то что переменная экземпляра i в классе В скрывает переменную, base позволяет получить доступ к базовому классу.
Методы — это процедуры (подпрограммы), которые манипулируют данными, определенными в классе, и во многих случаях обеспечивают доступ к этим данным. Обычно различные части программы взаимодействуют с классом посредством его методов. Любой метод содержит одну или несколько инструкций. Каждый метод имеет имя, и именно это имя используется для его вызова. Запись метода: доступ тип_возврата имя (список_параметров) {// тело метода }
public int Met() { return m; }//метод для получения значения m
Параметры исп для обмена инф с методом. Методы также имеют спецификаторы virtual, override, abstract…
Полиморфи́зм — возможность объектов с одинаковой спецификацией иметь различную реализацию.
Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования.
Полиморфизм позволяет писать более абстрактные программы и повысить коэффициент повторного использования кода.
Простым примером полиморфизма может послужить руль автомобиля. Концепцию полиморфизма часто выражают такой фразой: "один интерфейс — много методов". Это означает, что для выполнения группы подобных действий можно разработать общий интерфейс. Полиморфизм позволяет понизить степень сложности программы, предоставляя программисту возможность использовать один и тот же интерфейс для задания общего класса действий. Конкретное (нужное в том или ином случае) действие (метод) выбирается компилятором. Программисту нет необходимости делать это вручную. Его задача — правильно использовать общий интерфейс.
В основе полиморфизма, характерного для семейства классов, лежат три механизма:
• одностороннее присваивание объектов внутри семейства классов; сущность, базовым классом которой является класс предка, можно связать с объектом любого из потомков. Другими словами, для введенной нами последовательности объектов xk присваивание xi = xj допустимо для всех j >=i;
• переопределение потомком метода, наследованного от родителя. Благодаря переопределению, в семействе классов существует совокупность полиморфных методов с одним именем и сигнатурой;
• динамическое связывание, позволяющее в момент выполнения вызывать метод, который принадлежит целевому объекту.
Способы реализации: перегрузка методов и операций, виртуальные методы.