Слайд 1Обращение к методу класса-предка
Пусть теперь метод Compare() будет нестатичным и
описывается в самом классе Person. В этом случае возникает вопрос,
как из класса-наследника обратиться к методу класса-предка. Для этого используется ключевое слово base, отсылающее к предку текущего класса.
class Person
{
public string Compare(Person p)
{
bool equal = Equals(p); // переопределенный метод
bool fullEqual = base.Equals(p); // метод класса-предка
if (fullEqual) return "Совпадение по ссылкам";
if (equal) return "Совпадение по свойствам";
return "Объекты различны";
}
}
Слайд 2Обращение к методу класса-предка
Следует отметить, что если ключевое слово this
отсылало нас к объекту текущего класса, то ключевое слово base
отсылает нас к предку текущего класса.
При обращении по ключевому слову base всегда вызывается метод класса-предка, даже если он был переопределен в классе-наследнике при помощи ключевого слово override.
Кроме того, вызвать метод класса-предка через ключевое слово base можно только из самого класса-наследника, но не из какого-либо другого.
Слайд 3Вложенные классы
Ранее мы работали только с независимыми классами.
Однако классы могут
быть вложены друг в друга.
public class Box
{
// Описание свойств
и методов класса Box
public class Window
{
// Описание свойств и методов класса Window
public void ShutWindow()
{ /* Код метода ShutWindow() */ }
}
Window w = new Window(); // Переменная типа Window
public Window FrontWindow // Свойство FrontWindow
{ get { return w }
set { w = value } }
}
Слайд 4Вложенные классы
Чтобы стало возможным превратить класс Window в свойство FrontWindow,
он должен быть открытым (описан с использованием модификатора доступа public).
Вызовем
метод ShutWindow() у вложенного (nested) класса:
Box b = new Box();
b.FrontWindow.ShutWindow();
Вложенные классы видны только в пределах класса-хозяина. Поэтому описание такого же окна в другом классе (например, в классе House) потребует копирования всего кода. В связи с этим универсальные классы лучше описывать как независимые, а не вложенные.
Если вложенный класс объявлен как private, то его экземпляр может создать только объект такого же класса или объект, родительский для данного. При этом объект не будет виден наследникам от родительского. Объекты класса, описанного с protected, могут создаваться как родительским объектом, так и наследниками от родительского.
Слайд 5Вложенные классы
public class Window
{
// Описание свойств и методов класса Window
public
void ShutWindow()
{ /* Код метода ShutWindow() */ }
}
public class Box
{
//
Описание свойств и методов класса Box
Window w = new Window(); // Переменная типа Window
public Window FrontWindow // Свойство FrontWindow
{ get { return w }
set { w = value } }
}
Слайд 6Область видимости
using System;
class Program
{
int fact = 1;
public static void Main()
{
int
max = 5;
for (int i = 2; i
i++) { fact *= i; }
Console.WriteLine(fact);
}
}
Слайд 7Область видимости
Область видимости переменной определяется рядом правил.
Если переменная была объявлена
внутри класса, но вне метода, то она видна всем методам
класса независимо от ее модификаторов доступа (например, переменная fact видна во всем классе).
При объявлении внутри метода переменная будет доступна до соответствующей закрывающей фигурной скобки } (например, переменная max доступна только в пределах метода Main()).
Если переменная объявлена внутри цикла, то она видна только в пределах цикла (например, переменная i недоступна за пределами цикла for).
Слайд 8Область видимости
При описании классов область видимости их составляющих следует регулировать
при помощи модификаторов доступа private, protected и public.
Изначально при объявлении
элементов класса лучше указывать для них модификатор доступа private (выставляется по умолчанию, если модификатор доступа не был указан). В этом случае составляющие класса будут доступны только в пределах своего класса-хозяина и недоступны даже его потомкам.
Если классу-потомку требуется получить доступ элементу класса-родителя (например, к методу), для данного элемента следует сменить модификатор доступа на protected.
Если же требуется, чтобы элемент класса был доступен не только потомкам, но и вообще любым сторонним классам, в этом случае модификатор доступа меняется на public.
Для переменных класса public использовать нежелательно (но допускается protected, чтобы переменную могли видеть наследники класса). Работу с закрытой переменной лучше организовать через превращение её в свойство, для которого настроить работу аксессоров get и set.
Слайд 9Область видимости
Иногда требуется запретить саму возможность наследования от определенного класса
(например, чтобы исключить возможность нарушения работы программы через доступ к
закрытым элементам класса посредством наследования). Запретить наследование можно, указав перед объявляемым классом ключевое слово sealed (англ. «запечатать»).
sealed public class Person // Класс закрыт для наследования
{
// Описание класса
}
public class MyPerson : Person // Ошибка наследования
{
// Описание класса
}