Поддержка наследования в C# состоит в том, что в объявление одного класса разрешается вводить другой класс. Для этого при объявлении производного класса указывается базовый класс. Рассмотрим для начала простой пример. Ниже приведен класс TwoDShape, содержащий ширину и высоту двухмерного объекта, например квадрата, прямоугольника, треугольника и т.д.
//клас для двумерных обьектов.
class TwoDShape
{
public double Width;
public double Heigth;
public void ShowDim()
{
Console.WriteLine("Ширина и высота равны " + Width + " и " + Heigth);
}
}
Класс TwoDShape может стать базовым, т.е. отправной точкой для создания классов, описывающих конкретные типы двумерных объектов.
//пример простой иерарзии класов
using System;
//клас для двумерных обьектов.
class TwoDShape
{
public double Width;
public double Heigth;
public void ShowDim()
{
Console.WriteLine("Ширина и высота равны " + Width + " и " + Heigth);
}
}
//клас Triangle, производный от класса TwoDShape.
class Triangle: TwoDShape
{
public string Style; //тип треугольника
//возвратить площадь треугольника.
public double Area()
{
return Width * Heigth / 2;
}
//показать тип треугольника.
|
|
public void ShowStyle()
{
Console.WriteLine("Треугольник " + Style);
}
}
class Shapes
{
static void Main()
{
Triangle t1 = new Triangle();
Triangle t2 = new Triangle();
t1.Width = 4.0;
t1.Heigth = 4.0;
t1.Style = "равнобедренный";
t2.Width = 8.0;
t2.Heigth = 12.0;
t2.Style = "прямоугольный";
Console.WriteLine("Сведения об обьекте t1: ");
t1.ShowStyle();
t1.ShowDim();
Console.WriteLine("Площадь равна " + t1.Area());
Console.WriteLine();
Console.WriteLine("Сведения об обьекте t2: ");
t2.ShowStyle();
t2.ShowDim();
Console.WriteLine("Площадь равна " + t2.Area());
}
}
В классе Triangle создается особый тип объекта класса TwoDShape (в данном случае — треугольник). Кроме того, в класс Triangle входят все члены класса TwoDShape, к которым, в частности, добавляются методы Area() и ShowStyle().
Обратите внимание на синтаксис, используемый в классе Triangle для наследования класса TwoDShape.
class Triangle: TwoDShape
Этот синтаксис может быть обобщен. Всякий раз, когда один класс наследует от другого, после имени базового класса указывается имя производного класса, отделяемое двоеточием.
В класс Triangle входят все члены его базового класса TwoDShape, и поэтому в нем переменные Width и Height доступны для метода Area(). Кроме того, объекты t1 и t2 в методе Main() могут обращаться непосредственно к переменным Width и Height, как будто они являются членами класса Triangle.
Несмотря на то что класс TwoDShape является базовым для класса Triangle, в то же время он представляет собой совершенно независимый и самодостаточный класс.
Разумеется, объект класса TwoDShape никак не связан с любым из классов, производных от класса TwoDShape, и вообще не имеет к ним доступа.
Ниже приведена общая форма объявления класса, наследующего от базового класса.
class имя_производного_класса: имя_базового_класса
|
|
{
// тело класса
}
Для любого производного класса можно указать только один базовый класс.
Тем не менее можно создать иерархию наследования, в которой производный класс становится базовым для другого производного класса.
Главное преимущество наследования заключается в следующем: как только будет создан базовый класс, в котором определены общие для множества объектов атрибуты, он может быть использован для создания любого числа более конкретных производных классов. А в каждом производном классе может быть точно выстроена своя собственная классификация. В качестве примера ниже приведен еще один класс, производный от класса TwoDShape и инкапсулирующий прямоугольники.
// Класс для прямоугольников, производный от класса TwoDShape.
class Rectangle: TwoDShape
{
// Возвратить логическое значение true, если прямоугольник является квадратом.
public bool IsSquare()
{
if (Width == Height) return true;
return false;
}
// Возвратить площадь прямоугольника.
public double Area()
{
return Width * Height;
}
}