
- •Абстрактные классы и наследование
- •Синтаксис объявления
- •Правила работы с абстрактными методами:
- •Класс, наследующий абстрактный класс,
- •//наследующий класс
- •class Demo
- •Ограничения на наследование
- •Абстрактный класс object
- •Методы класса
- •public virtual bool Equals (object obj)
- •public static bool ReferenceEquals (object obj1,
- •using System;
- •типы указываются в полной форме, с
- •public virtual int GetHashCode ( )

Абстрактные классы и наследование
При создании иерархии для базового класса можно
не указывать реализацию методов.
В базовом абстрактном классе определяются
имя метода,
тип возвращаемого результата,
параметры.
Сами действия описываются в наследующих классах.
Для того, чтобы явно выделить метод с пустым телом,
вопределении пишут ключевое слово abstract.
Такой подход облегчает наследование, т.к. прямо показывает, что данный (абстрактный) метод
необходимо переопределить в наследующем классе.
1

Синтаксис объявления
для абстрактного метода:
access abstract res_type met_name (par_list);
для абстрактного свойства:
access abstract prop_type prop_name
{
get;
set;
}
2

Правила работы с абстрактными методами:
Абстрактный метод автоматически интерпретируется как виртуальный,
модификатор virtual для абстрактного метода
не требуется,
это считается ошибкой.
Модификатор abstract не указывается для статических методов.
Абстрактные методы и свойства нельзя объявлять
суровнем доступа private.
Класс, содержащих один и более абстрактных
методов, должен быть объявлен как абстрактный –
смодификатором abstract в заголовке.
Не допускается
создание экземпляров абстрактного класса,
но можно объявлять ссылочные переменные типа абстрактного класса.
3

Класс, наследующий абстрактный класс,
также становится абстрактным,
если не переопределен хотя бы один абстрактный метод (свойство).
Абстрактные методы (свойства) переопределяются так же, как и виртуальные (с ключевым словом override).
Пример
(принцип использования абстрактных классов).
using System;
namespace virt1
{
abstract class A
{
//абстрактный метод в наследуемом классе
public abstract void show();
}
4

//наследующий класс
class B1: A
{
//переопределение метода в наследующем классе
public override void show()
{
Console.WriteLine("метод, переопределенный в классе B1");
}
}
//наследующий класс
class B2: A
{
//переопределение метода в наследующем классе
public override void show()
{
Console.WriteLine("метод, переопределенный в классе B2");
}
}
5

class Demo
{
static void Main( )
{
//A objA = new A(); этот объект создать нельзя!
B1 objB1 = new B1 ();
B2 objB2 = new B2 ();
A refA; //переменную объявить можно!
refA = objB1;
refA.show(); //версия метода из класса B1
refA = objB2;
refA.show(); //версия метода из класса B2
}
}
}
6

Ограничения на наследование
При создании классов иногда требуется явно запретить строить наследующие классы.
Например, при:
совместной работе над одним проектом
или
использовании некоторых стандартных
классов (например, невозможно построить
класс, наследующий классу string).
Для этого используют модификатор sealed (букв. запечатанный).
Синтаксис :
sealed class class_name…
Не допускается совместное использование модификаторов sealed и abstract.
Это очевидно –
абстрактный класс должен быть завершен в
наследующих классах.
7

Абстрактный класс object
Определенный в C# класс object является базовым для всех без исключения типов
(классов и обычных типов).
Если при создании класса не указан наследуемый
класс, то таковым по умолчанию считается класс object.
ссылочная переменная типа object может ссылаться на объект
любого типа,
Полная форма имени класса - System.Object
Данный класс принадлежит библиотеке классов
.NET Framework.
Многие методы этого класса эффективны для любых наследующих классов.
8

Методы класса
public virtual string ToString ( )
Метод возвращает представление текущего объекта в виде строки, содержащей его имя пространства имен и имя класса.
При переопределении можно возвратить любую строку.
Метод часто используют для получения информации о состоянии объекта. Например:
public override string ToString ( )
{
return “это экземпляр класса MyClass”;
}
9

public virtual bool Equals (object obj)
Метод возвращает
значение true, если текущий вызывающий объект
является тем же экземпляром, что и obj,
иначе – false.
public static bool Equals (object obj1, object obj2)
Метод возвращает
значение true, если obj1 и obj2 – одинаковые объекты,
иначе – false.
Метод проверяет равенство объектов.
10