Полиморфизм. Абстрактные классы
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Полиморфизм. Абстрактные классы.
1) Виртуальные методы на C#. Полиморфизм.
Полиморфизм – разнообразие форм биологических существ. Нечто одинаковое по форме,
но совершенно разные по поведению.
Имеем базовый класс Record и производный Sprint с полем dec. Выполним перегрузку метода
Numbersec. Numbersec объявим виртуальнам методом.
На C# виртуальные методы такие же как на C++
Record.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Record
{
protected int min, sec;
public Record(int m, int s)
{
min = m;
sec = s;
}
public int Numbersec()
{
return 60 * min + sec;
}
public bool qualification()
{
int k;
k = Numbersec();
if (k <= 127)
return true;
else
return false;
}
}
}
1
Sprint.cs
class Sprint:Record
{
private int dec;
public Sprint(int m, int s, int d):base(m,s)
{
dec = d;
}
public int Numbersec()
{
int k;
k = 60 * min + sec;
if (dec >= 5)
k++;
return k;
}
}
Program.cs
class Program
{
static void Main(string[] args)
{
Record a = new Record(2, 7);
Sprint b = new Sprint(2, 7, 8);
bool f1, f2;
f1 = a.qualification();
f2 = b.qualification();
}
}
f1=true
f2=true - qualification() -> Numbersec() из базового класса
Numbersec() - виртуальная функция
Record.cs
using System;
using System.Collections.Generic;
......
virtual public int Numbersec()
{
.......
2
Sprint.cs
class Sprint:Record
{
..........
public override int Numbersec() // override - перегружена
{
.........
Program.cs
class Program
{
static void Main(string[] args)
{
Record a = new Record(2, 7);
Sprint b = new Sprint(2, 7, 8);
bool f1, f2;
f1 = a.qualification();
f2 =b.qualification();
}
}
f2=false !
Объект b производного класса [ b.qualification();] определяет вызов Numbersec() из
производного класса Sprint
2) Вызов виртуальной функции на C# после присваивания указателей.
Пусть Numbersec не виртуальная функция, перегружена в Sprint с округлением.
вызов метода динамическим объектом:
static void Main(string[] args)
{
Record b = new Record(2,7);
Sprint d = new Sprint(2, 7, 8);
b=d;
k=b.Numbersec(); // k=127
Numbersec() - виртуальная
k = b.Numbersec(); // k=128
3
3) Абстрактные классы и функции на C#.
На C# имеются виртуальные функции как на C++ (virtual) и абстрактные (abstract) как
на Java.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
abstract class Figure // абстрактный класс
{
protected double X, Y, L; // координаты центра и длина
public double GetLen()
{
return L;
}
public Figure(double xx, double yy, double ll)
{
X = xx;
Y = yy;
L = ll;
}
public abstract double S(); // абстрактная функция
}
class Circle : Figure // производный не абстрактный класс
{
public Circle(double xx,double yy,double ll):base(xx,yy,ll)
{
}
public override double S() // перегрузка абстрактной функции
{
return 3.1415926*L*L;
}
};
class Square : Figure // производный не абстрактный класс
{
public Square(double xx, double yy, double ll): base(xx, yy, ll)
{
}
public override double S() // перегрузка абстрактной функции
{
return L * L;
}
4
};
class Triangle : Figure // производный не абстрактный класс
{
public Triangle(double xx, double yy, double ll): base(xx, yy, ll)
{
}
public override double S() // перегрузка абстрактной функции
{
return L * L * Math.Sqrt(3.0) / 8;
}
};
class Program
{
static void Main(string[] args)
{
double yc, ys, yt;
Circle c = new Circle(3, 4, 5);
yc = c.S();
Square s = new Square(3, 4, 5);
ys = s.S();
Triangle t = new Triangle(3, 4, 5);
yt = t.S();
//
Figure f = new Figure(3, 4, 5);
}
}
}
5