
- •Классы. Создание экземпляров класса. Особенности перегрузки конструкторов
- •Классы: особенности инициализации полей, поля const и readonly
- •Статические элементы класса. Статический конструктор.
- •Индексаторы
- •Механизмы наследования. Объявление наследования.
- •Конструкторы производных и базовых классов. Использование ключевого слова base.
- •Скрытие наследуемых элементов.
- •Переопределение наследуемых элементов.
- •Полиморфное поведение производных классов.
- •Абстрактные методы и классы.
- •Интерфейсы. Операции is и as.
- •Разработка и использование интерфейсов.
- •Делегаты.
- •События. Правила использования стандартных делегатов.
Полиморфное поведение производных классов.
Полиморфизм— это способность, которая позволяет одному интерфейсу получать доступ к целому классу действий.
Более глубокое использование полиморфизма обеспечивает использование виртуальных методов. Модификатором virtual отмечаются методы, которые могут быть переопределены в его производных классах. Таким образом, правильнее говорить о системе
виртуальных функций, начало которой находится в корневом классе некоторой иерархии типов.
Любой класс, расположенный вниз по иерархии от базового, в котором имеется метод с модификатором virtual (в
режиме public или protected), может поступить с этим методом двояко: Ничего не делать и тем самым унаследовать базовую реализацию; Переопределить метод, используя модификатор override . При этом
сигнатура новой версии виртуального метода должна точно соответствовать базовой; Перекрыть метод, используя модификатор new.
using System; namespace Элемент
{class Место {int X,Y;
public Место(int x,int y){X=x; Y=y;}
virtual public string type()
{return String.Format
("Координаты: X={0},Y={1}", X, Y); } }
class Линия : Место
{int Length;
public Линия(int x, int y, int length): base(x, y) { Length = length; }
public override string type()
{return base.type()+"Длина:" +Length;} }
class Окружность : Место
{int Radius;
public Окружность(int x, int y, int radius) : base(x, y) { Radius = radius;}
public override string type()
{return base.type()+"Радиус:"+Radius;} }
class Program
{static void Main()
{Место[] mass = {new Место(1,1), newЛиния(2,2,2),new Окружность(3,3,3),};
foreach (Место i in mass) Console.WriteLine(i.type()); } } }
Координаты: X=1, Y=1
Координаты: X=2, Y=2 Длина:2
Координаты: X=3, Y=3 Радиус: 3
тип производного класса всегда и неявно может быть преобразован к типу базового класса, в том числе - и к типу любого непрямого базового класса! В данном примере это преобразование выполняется каждый раз при сохранения адреса конкретного объекта в массиве mass ссылок на класс Место.
Абстрактные методы и классы.
Методы класса могут быть объявлены как абстрактные. Это означает, что в этом классе нет реализации этих методов. Абстрактные методы пишутся с модификатором abstract. Класс, в котором есть хотя бы один абстрактный метод, называется абстрактным (а таком классе могу быть и обычные методы). Нельзя создавать экземпляры абстрактного класса - такой класс может использоваться только в качестве базового класса для других классов. Для потомка такого класса есть две возможности - или он реализует все абстрактные методы базового класса (и в этом случае для такого класса-потомка мы сможем создавать его экземпляры), или он реализует не все абстрактные методы базового класса (в этом случае он является тоже абстрактным классом и единственная возможность его использования - это производить от него классы-потомки).
namespace test
{ abstract class Figure
{ public abstract double perimeter(); }
class Rectangle : Figure
{ double a, b;
public Rectangle(double a, double b)
{ this.a = a; this.b = b; }
public override double perimeter()
{ return (a + b) * 2; } }
class Test
{ public static void Main()
{ Rectangle f2 = new Rectangle(2,6); System.Console.WriteLine("Периметр прямоугольника = {0}",f2.perimeter()); } } }
На экране: 16