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# не поддерживает множественное наследование, но позволяет создавать иерархию классов при наследовании. В ней один производный класс становится базовым для следующего производного класса и т.д.

Private double Stepen(int pokaz) - student2.ru

Задание: Создать класс квадрат 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());

//Выполнить!

Наши рекомендации