Lecture5 Deriv
Lecture5 Deriv
Наслідування класів
Досить часто об’єкти різних класів можуть мати одні
і ті ж елементи даних. Наприклад, анкетні дані
потрібні і для студента, і для викладача, і для
офіцера, і для спортсмена
і т. д. Нераціонально в кожному класі передбачати
окремо такі елементи даних якім’я, прізвище, вік,
адресу та інші загальні дані. Таку інформацію зручно
розмістити в узагальненому класі, наприклад в класі
«Людина». Це буде базовий клас. А класи «студент»,
«викладач» та інші зробити похідними від класу
«Людина».
2
В базовому класі доступ до елементів даних повинен
бути не private, а protected. Це дозволяє похідним
класам використовувати елементи даних базового
класу. На відміну від С та С++ після мітки доступу
двокрапку ставити не треба. Проте мітку доступу
тепер треба ставити перед кожним елементом
даних або перед кожним методом. Інакше буде
доступ по замовчуванню. Описання похідного класу
має вид:
class ім’я_похідного_класу : ім’я_базовго_класу
{
}
3
Приклад:
namespace pr1
{
class man
{
}
class student: man
{
}
}
4
Похідний клас, в свою чергу, може бути
базовим для іншого класу.
Приклад: Є базовий клас «людина” із
елементом даних «ім’я» і похідний від нього
клас «студент». В свою чергу від класу
«студент» є похідний клас «спортсмен».
5
using System;
using System.Collections.Generic;
using System.Text;
namespace man_stud_sport
{
class man
{
protected string name;
}
8
Постановка задачі
Створити базовий клас “Людина” із
елементами даних “ім'я” , “адреса” та
“вік” і похідний клас “Студент” із
елементом даних “професія”
9
* Created by SharpDevelop.
* User: AVR
* Date: 01/04/2013
* Time: 11:11
*
* To change this template use Tools | Options | Coding | Edit
Standard Headers.
*/
using System;
namespace inherit1
{
class man
{
protected string name;
protected string address;
protected int age;
} 10
class student : man
{
string profession;
public void input_stud()
{
string s;
Console.WriteLine("Enter name");
name=Console.ReadLine();
Console.WriteLine("Enter address");
address=Console.ReadLine();
Console.WriteLine("Enter age=");
s=Console.ReadLine();
age=Convert.ToInt32(s);
Console.WriteLine("Enter profession");
profession=Console.ReadLine();
} 11
public void output_stud()
{
Console.WriteLine("name is {0} address is {1}
age={2}",name,address,age);
Console.WriteLine("Profession is {0}",profession);
}
}
12
class Program
{
public static void Main(string[] args)
{
student x=new student();
x.input_stud();
x.output_stud();
Console.WriteLine("Finish!");
14
При описанні інтерфейсу вживається ключове слово
interface. Домовилися ідентифікатори інтерфейсів писати із
великої букви I. Наприклад,
interface IDovgina
{
double dovg();
}
Далі приведено клас А, який реалізує інтерфейс
Idovgina. Його ім'я відділено від імені класу двокрапкою.
Інтерфейсів може бути багато. Їхні імена розділяються
комами, але базовий клас, (якщо він є), ставиться відразу
після двокрапки.
class A: IDovgina
{
}
15
Не забувати визначати усі функції, які вказано при описанні
інтерфейса.
Не можна розкривати лише частину із них.
По замовчуванню доступ до усіх функцій, які вказані при
описанні інтерфейсу, є public. Тому доступ до них явно
указувати не потрібно. Буде помилка!
Члени інтерфейсу не можуть бути static.
Приклад 1
Визначається інтерфейс, який передбачає, що любий клас,
який реалізує цей інтерфейс, має функцію для обчислення
відстані між двома точками із заданими координатами x та y.
16
/*
* Created by SharpDevelop.
* User: User
* Date: 11.01.2021
* Time: 13:25
*/
using System;
namespace interface2
{
Interface IVidstan
{
double vidst();
}
class A:IVidstan
{
double x,y;
public A()
{
}
public A(double xx,double yy)
{
x=xx;
y=yy;
}
public double vidst()
{
return Math.Sqrt(x*x+y*y);
}
}
17
class Program
{
public static void Main(string[] args)
{
double x,y ;
Console.WriteLine("Enter x=");
x=Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Enter y=");
y=Convert.ToDouble(Console.ReadLine());
A ob=new A(x,y);
double r;
r=ob.vidst();
Console.WriteLine("Вiдстань r={0}",r);
Console.WriteLine("Бувайте!");
19
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace interface1
{
interface IPerimetr
{
double p();
}
interface IPlo
{
double s();
} 20
class rectangle : IPerimetr, IPlo
{
double width, length;
public rectangle(double a, double b)
{
width = a;
length = b;
}
public double p()
{
return 2 * (width + length);
}
public double s()
{
return width * length;
}
}
21
class circle : IPerimetr, IPlo
{
double R;
public circle(double r)
{
R = r;
}
public double p()
{
return 2 * Math.PI * R;
}
public double s()
{
return Math.PI * R * R;
}
}
22
class Program
{
static void Main(string[] args)
{
rectangle ob = new rectangle(2, 3);
Console.WriteLine(" For rectangle
perimetr={0} plo={1}", ob.p(), ob.s());
circle ob2 = new circle(1);
Console.WriteLine(" For circle perimetr={0}
plo={1}", ob2.p(), ob2.s());
}
}
}
23
Приклад 3
Визначено ДВА інтерфейси. Один
передбачає обчислення площі , а інший -
об’єму.
Два класи реалізують ці інтерфейси.
24
/*
* Created by SharpDevelop.
* User: User
* Date: 22.06.2017
* Time: 18:20
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
namespace interface2
{
public interface ISquare
{
double plo();
}
public interface IVolume
{
double v();
}
25
class paralelepiped:ISquare,IVolume
{
double width,height, length;
28
Віртуальні функції
У багатьох випадках зручно, коли у базовому і в похідних від
нього класах функції, які мають одне і те ж конкретне
призначення, мали одинакові назви, хоча їхнє наповнення, як
правило, різне .Так, якщо є базовий клас «літак» і похідні
від нього класи « пасажирський лайнер» і «винищувач», то
функції для введення інформації про лайнер і про винищувач
будуть значно відрізнятися, хоча вони матимуть одне і
теж ім’я. В такому випадку ці функції повинні бути
визначені як віртуальні (virtual). У випадку, якщо похідний клас
не має своїх віртуальних функцій, ці функції автоматично
викликаються із базового класу. Тому в базовому класі вони
повинні бути ОБОВ’ЯЗКОВО! В приведеній нижче програмі цей
випадок продемонстровано на прикладі похідного класу
«пальто» .
29
Приклад:
Приведено базовий клас «одежа» і похідні від
нього класи: «костюм» і «пальто». Загальним
для усіх цих класів є «бренд». В базовому класі
є функції input() , output() для введення та
виведення цієї загальної інформації. В
похідному класі «костюм» також є функції з
цими ж назвами, але вони вводять і виводять
не тільки «бренд», але і іншу інформацію про
костюми. Ці функції об’явлені
віртуальними( virtual).
30
using System;
using System.Collections.Generic;
using System.Text;
namespace clothes1
{
class clothes
{
protected string brand;
31
public virtual void output()
{
Console.WriteLine("brand is {0}",brand);
}
} // The end of clothes class
32
class suit : clothers
{ double size;
string color;
public virtual void input()
{ string s;
Console.WriteLine("Enter suit brand ");
brand = Console.ReadLine();
Console.WriteLine("Enter size of suit");
s = Console.ReadLine();
size = Convert.ToDouble(s);
Console.WriteLine("Enter color of suit:");
color = Console.ReadLine();
}
33
public virtual void output()
{
Console.WriteLine(" The suit brand is {0}",
brand);
Console.WriteLine("The size of suit is
{0}",size);
Console.WriteLine("It's color is {0}",color);
}
} // The end of suit class
34
class coat : clothes
{
public coat()
{
Console.WriteLine("\n\n Now you can see an object of coat class.");
Console.WriteLine(" It's need thing if it's cold.");
Console.WriteLine("\n This class has no an input() and an
output() functions.");
Console.WriteLine("In this case the functions of base class are
used.");
Console.WriteLine("That's why it's possible to input and to
output only common information.");
Console.WriteLine("In this case it's a brand.");
}
} // The end of coat class
35
class Program
{
static void Main(string[] args)
{
suit q = new suit();
q.input();
q.output();
//Pay attention! The common information "brand" from
base class is used in derived class.
coat c = new coat();
c.input();
c.output();
}
}
} 36
37
38
39
Абстрактні класи
• Базовим класом може бути абстрактний клас, який
не має всієї конкретної інформації про об’єкти
класу.
Наприклад, клас «фігура» узагальнює поняття про
різні фігури. Зокрема, вони можуть бути плоскими і
об’ємними, мати різну форму і т.д.
• Ясно, що відсутність повної інформації не дозволяє
створити функції для введення даних, їхньої обробки,
виведення результатів. Тобто можна ці функції
назвати, інколи навіть вказати типи і кількість
формальних параметрів, але для конкретного
заповнення інформації не вистачає. Тоді таку
функцію об’являють абстрактною (abstract).
40
Конкретно вона буде визначена в похідному класі. В ній слово abstract буде
замінене на override. Клас, в якому є хоча б одна абстрактна функція,
називається абстрактним. Ясно, що не можна створити об’єкт
абстрактного класу.
Приклад:
abstract class animal
{
protected string name;
public abstract void input();
}
class monkey: animal
{
string type_of_monkey;
public override void input()
{
Console.WriteLine(“Enter type of monkey:”);
type_of_monkey=Console.ReadLin e();
}
}
41
Постановка задачі
Створити абстрактний базовий клас “Фігура”
з елементами даних: площа та периметр і
абстрактними віртуальними функціями для
введення даних, обчислення площі, обчислення
периметру і виведення результатів на
екран.
Створити похідні класи: коло та
прямокутник.
42
// Created by SharpDevelop.
using System;
namespace abstract1
{
abstract class figure
{
protected double square;
protected double perimeter;
public abstract void input();
public abstract void s();
public abstract void p();
public abstract void
output();
43
}
44
class circle: figure
{
double diameter;
public override void input()
{
string s;
Console.WriteLine("Enter diameter");
s=Console.ReadLine();
diameter=Convert.ToDouble(s);
}
public override void s()
{
square=Math.PI*Math.Pow(diameter,2)/4;
45
public override void p()
{
perimeter=Math.PI*diameter;
}
46
class rect: figure
{
double length;
double width;
public override void input()
{
string s;
Console.WriteLine("Enter length=");
s=Console.ReadLine();
length=Convert.ToDouble(s);
Console.WriteLine("Enter width=");
s=Console.ReadLine();
width=Convert.ToDouble(s);
}
public override void s()
{
square=length*width;
} 46
public override void p()
{
perimeter=2*(length+width);
}
}
47
class Program
{
public static void Main(string[] args)
{
figure fig;
circle x=new circle();
fig=x;
fig.input();
fig.s();
fig.p();
fig.output();
48
rect y=new rect();
fig=y;
fig.input();
fig.s();
fig.p();
fig.output();
Console.WriteLine(“Finish!");