Private double Stepen(int pokaz)
{
double rez = 1; //1=2^0
for (int i = 1; i <= pokaz; i++)
rez *= 2;
return rez;
}
//Индексатор:
public double this [int index]
{
Get
{
if (index >= 0 && index < 16)
return Stepen(index);
else return -1;
}
}
//В Main():
//////////////Класс Stepeni_2/////////////////
Stepeni_2 Ob_Step = new Stepeni_2();
Console.WriteLine("Первые десять степеней числа 2:");
for (int i = 1; i <= 10; i++)
Console.Write(Ob_Step[i]+" ");
Console.WriteLine();
Console.WriteLine("2 в степени 18 = "+Ob_Step[18]);
//Выполнить и проанализировать ответ!
Наследование, базовые и производные классы. Доступы к членам базовых классов.Конструкторы и наследование (проект «Наследование»). Виртуальные методы и их переопределение как механизм реализации полиморфизма. Абстрактные классы, переопределение абстрактных методов.
§5. Наследование, базовые и производные классы
Введение
После исследования различных подходов создания классов с реализацией инкапсуляции (это - private (закрытые) члены класса, свойства и индексаторы), будем строить семейство связанных классов. Для этого существует третий принцип объектно-ориентированного программирования – наследование. Под этим термином понимается возможность передачи данных и средств исполнения от родительского объекта другим объектам. Вместо того, чтобы создавать новый объект (новый класс) с самого начала будем использовать уже готовый объект и лишь дополнять его своими чертами. Таким образом, наследование упрощает многократное использование программного кода.
Наследование бывает двух видов:
¾ классическое наследование (отношение подчиненности);
¾ модель локализации/делегирования (отношение локализации). Это значит, что объект уже не является уточненной версией другого объекта, а содержит в себе этот объект.
Мы будем изучать идеи классического наследования. Наследование слишком часто применять не надо, а лишь там, где оно оправдано, т.е. в некоторых классах есть какие-то похожие функции (виртуальные).
Базовые и производные классы
Класс, который наследуется, называется базовым. Класс, который наследует базовый, называется производным. Следовательно, производный класс – это специализированная версия базового класса.
При объявлении производного класса сначала записывается его имя, а затем через двоеточие имя базового класса, например:
class Derived1:Base1
{ … }
В C++ реализовано множественное и единичное наследование. Но задач на множественное наследование очень мало. В С# явным образом реализовано лишь единичное наследование, однако множественное наследование реализуется через интерфейсы.
Задание: Создать проект «Наследование», в нем разработать класс Figure, который будет базовым классом для классов, объекты которых – геометрические фигуры на плоскости.
class Figure
{
double size1, size2;
/////Свойства:
public double Width
{
get { return size1; }
set { size1 = value; }
}
public double Height
{
get { return size2; }
set { size2 = value; }
}
public void Show()
{
Console.WriteLine("1-ое измерение фигуры = {0:0.###}, 2-ое измерение фигуры = {1:0.###} ", size1, size2);
}
}
//В Main():
Figure Ob = new Figure();
Ob.Show();
//Выполнить!!
Ob.Width = 13;
Ob.Height = 3.8;
Ob.Show();
//Выполнить
Задание: Создать производный класс Прямоугольник (Rectangle).
class Rectangle : Figure
{
public double area() ////площадь
{
return Width * Height;
}
public double perimetr() //периметр
{
return 2 * (Width + Height);
}
}
// В Main():
Rectangle Rt1 = new Rectangle();
Rt1.Show(); ///Выполнить!!!
Rt1.Width = 10;
Rt1.Height = 5;
Console.WriteLine("Площадь прямоугольника = {0:0.##}, его периметр = {1:0.##}", Rt1.area(), Rt1.perimetr());
////Выполнить!!!
Задание: Создать класс Треугольник (Triangle).
class Triangle : Figure
{
double c; // третья сторона треугольника
public double Storona_c
{
get { return c; }
set { c = value; }
}
public bool Is_Triangle
{
get
{
if (Width + Height > c && Width + c > Height && Height + c > Width)
return true;
else return false;
}
}
public double perimetr()
{
return (Width + Height + Storona_c);
}
public double area()
{
////////////////Корень из выражения (p(p-a)(p-b)(p-c)):
double p = perimetr() / 2;
return Math.Sqrt(p * (p - Width) * (p - Height) * (p - c));
}
//Медтоды, определяющие стиль треугольника по углам и сторонам!
public string Style1()
{
if (Width == Height && Width == c)
return "Равносторонний";
else
if (Width != Height && Width != c && Width != c)
return "Разносторонний";
else
return "Равнобедренный";
}
public string Style2()
{
double a = Width, b = Height;
if ((b * b + c * c - a * a) / (2 * b * c) < 0 || (a * a + c * c - b * b) / (2 * a * c) < 0 || (b * b + a * a - c * c) / (2 * a * b) < 0)
return "Тупоугольный";
else
if ((b * b + c * c - a * a) / (2 * b * c) > 0 && (a * a + c * c - b * b) / (2 * a * c) > 0 && (b * b + a * a - c * c) / (2 * a * b) > 0)
return "Остроугольный";
else
return "Прямоугольный";
}
public void Show_Triangle()
{
Show();
Console.WriteLine("третья сторона треугольника ={0:0.###}", c);
}
}
//В Main():
Triangle Tr1 = new Triangle();
Tr1.Show_Triangle();
if (Tr1.Is_Triangle)
Console.WriteLine("Треугольник существует");
else
Console.WriteLine("Треугольник не существует");
//Выполнитb!
Tr1.Width= 3;
Tr1.Height = 4;
Tr1.Storona_c = 5;
Tr1.Show_Triangle();
//Выполнитb!
if (Tr1.Is_Triangle)
Console.WriteLine("Треугольник существует, его S={0:0.##}, P={1:0.##}", Tr1.area(), Tr1.perimetr());
else
Console.WriteLine("Треугольник не существует!");
//Выполнить!
Console.WriteLine("Стиль треугольника по сторонам - "+Tr1.Style1());
Console.WriteLine("Стиль треугольника по углам - "+Tr1.Style2());
C# не поддерживает множественное наследование, но позволяет создавать иерархию классов при наследовании. В ней один производный класс становится базовым для следующего производного класса и т.д.
Задание: Создать класс квадрат Kwadrat, а в нем лишь одно свойство Is_Kwadrat (является ли фигура квадратом).
class Kwadrat:Rectangle
{
public bool Is_Kwadrat
{
get { return Width == Height; }
}
}
//В Main():
Kwadrat Kw1=new Kwadrat();
Kw1.Show();
if (Kw1.Is_Kwadrat)
Console.WriteLine("Это квадрат");
else
Console.WriteLine("Это НЕ квадрат");
//Выполнить!
Kw1.Width = 5;
Kw1.Height = 5;
Kw1.Show();
Console.WriteLine("Площадь квадрата = {0:0.##}, периметр = {1:0.##}",Kw1.area(),Kw1.perimetr());
//Выполнить!