Основы C#. Урок 19. Абстрактные классы
Методы класса могут быть объявлены как абстрактные. Это
означает, что в этом классе нет реализации этих методов.
Абстрактные методы пишутся с модификатором abstract. Класс, в
котором есть хотя бы один абстрактный метод, называется
абстрактным (а таком классе могу быть и обычные методы).
Нельзя создавать экземпляры абстрактного класса - такой класс
может использоваться только в качестве базового класса для
других классов. Для потомка такого класса есть две возможности
- или он реализует все абстрактные методы базового класса (и в
этом случае для такого класса-потомка мы сможем создавать его
экземпляры), или он реализует не все абстрактные методы
базового класса (в этом случае он является тоже абстрактным
классом и единственная возможность его использования - это
производить от него классы-потомки). Вот пример,
иллюстрирующий использование абстрактных классов: using System;
namespace test
{
abstract class Figure
{
//Площадь фигуры
public abstract double square();
public abstract double perimeter();
}
class Triangle: Figure
{
double a, b, c; //Стороны
//Конструктор
public Triangle(double a, double b, double c)
{
this.a=a;
this.b=b;
this.c=c;
}
public override double square()
{
//Используем формулу Герона
double p = (a+b+c)/2;
return Math.Sqrt(p*(p-a)*(p-b)*(p-c));
}
public override double perimeter()
{
return a+b+c;
}
}
class Rectangle: Figure
{
double a, b; //Стороны
//Конструктор
public Rectangle(double a, double b)
{
this.a=a;
this.b=b;
}
public override double square()
{
return a*b;
}
public override double perimeter()
{
return (a+b)*2;
}
}
class Test
{
public static void Main()
{
Figure f1, f2;
f1=new Triangle(3, 4, 5);
f2=new Rectangle(2, 6);
System.Console.WriteLine(f1.perimeter()+", "+ f1.square());
System.Console.WriteLine(f2.perimeter()+", "+ f2.square());
}
}
}
Тут мы объявляем абстрактный класс Figure, от которого
производим два класса - Rectangle (класс прямоугольника) и
Triangle (треугольника). В классе Figure есть два абстрактных
метода - square (для подсчета площади) и perimeter (для
периметра). Так как для призвольной фигуры формул для площади
и для периметра не существует, то эти методы объявлены в
классе Figure и переопределены в производных классах (с
ключевым словом override). Далее в классе Test мы проводим
испытание - заводим две переменные типа ссылка на базовый
класс Figure, ниже в эти ссылки мы записываем созданные
экземпляры производных классов Triangle и Rectangle. Обратите
внимание, что ссылку на абстрактный класс мы создать можем, а
экземпляр - нет. Далее мы выводим на экран периметр и площадь
для наших
фигур. |