0% found this document useful (0 votes)
4 views50 pages

Lecture5 Deriv

ukhkug

Uploaded by

hhsbbshsjsj
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
4 views50 pages

Lecture5 Deriv

ukhkug

Uploaded by

hhsbbshsjsj
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 50

Лекція 5

Наслідування класів
Досить часто об’єкти різних класів можуть мати одні
і ті ж елементи даних. Наприклад, анкетні дані
потрібні і для студента, і для викладача, і для
офіцера, і для спортсмена
і т. д. Нераціонально в кожному класі передбачати
окремо такі елементи даних якім’я, прізвище, вік,
адресу та інші загальні дані. Таку інформацію зручно
розмістити в узагальненому класі, наприклад в класі
«Людина». Це буде базовий клас. А класи «студент»,
«викладач» та інші зробити похідними від класу
«Людина».

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;
}

class student : man


{
protected string group;
} 6
class sportsman :student
{
string vid_sporta; //доступ по замовчуванню
public void input()
{
Console.WriteLine("Enter name");
name = Console.ReadLine();
Console.WriteLine("Enter group");
group = Console.ReadLine();
Console.WriteLine("Enter vid_sporta");
vid_sporta = Console.ReadLine();
}
public void output()
{
Console.WriteLine(" name is {0} group is {1} vid_sporta is {2}",
name, group, vid_sporta);
}
}
7
class Program
{
static void Main(string[] args)
{
sportsman q = new sportsman();
q.input();
q.output();
}
}
}

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!");

// TODO: Implement Functionality Here

Console.Write("Press any key to continue . . . ");


Console.ReadKey(true);
}
}
}
13
Інтерфейси
Інтерфейс це клас, який включає в себе лише заголовки функцій.
Ці функції визначають, що треба робити із даними. Їхній зміст буде
визначено в відповідних функціях тих класів, які підтримують цей
інтерфейс. Це нагадує наслідування абстрактних класів. Але в
абстрактних класах можуть бути загальними не тільки методи
(функції), але і елементи даних. Наприклад, в абстрактному класі
«Плоска_ фігура» є два елементи-дані: площа і периметр. На відміну
від абстрактних класів, в інтерфейсах є тільки прототипи функцій
(методів). Жодна із них не може мати «тіла». Справа в тому, що, на
відміну від С++, С# може наслідувати лише один базовий клас. Тому
всю іншу інформацію, загальну для багатьох похідних класів,
передають за допомогою інтерфейсів. В бібліотеці базових класів є
сотні перевизначених інтерфейсів, які можуть бути реалізовані в різних
класах і структурах.

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("Бувайте!");

Console.Write("Press any key to continue . . . ");


Console.ReadKey(true);
}
}
}
18
Приклад 2
Визначено ДВА інтерфейси. Один
передбачає обчислення площі , а інший -
периметру.
Два класи реалізують ці інтерфейси.

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;

public void vvod()


{
Console.WriteLine("Enter width=");
width=Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Enter height=");
height=Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Enter length=");
length=Convert.ToDouble(Console.ReadLine());
}
public double v()
{
return width*height*length;
}
public double plo()
{
return 2*(width*height+width*length+height*length);
}
} 26
class sphere:IVolume,ISquare
{
double R;
public void input()
{
Console.WriteLine("Enter R=");
R=Convert.ToDouble(Console.ReadLine());
}
public double plo()
{
return 4*Math.PI*R*R;
}
public double v()
{
return (4.0/3.0)*Math.PI*Math.Pow(R,3);
}
}
27
class Program
{
public static void Main(string[] args)
{
paralelepiped a=new paralelepiped();
a.vvod();
Console.WriteLine("площа ={0} об'єм={1}",a.plo(),a.v());
sphere r=new sphere();
r.input();
Console.WriteLine("площа ={0} об'єм={1}",r.plo(),r.v());
Console.WriteLine("Бувайте!");
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}

28
Віртуальні функції
У багатьох випадках зручно, коли у базовому і в похідних від
нього класах функції, які мають одне і те ж конкретне
призначення, мали одинакові назви, хоча їхнє наповнення, як
правило, різне .Так, якщо є базовий клас «літак» і похідні
від нього класи « пасажирський лайнер» і «винищувач», то
функції для введення інформації про лайнер і про винищувач
будуть значно відрізнятися, хоча вони матимуть одне і
теж ім’я. В такому випадку ці функції повинні бути
визначені як віртуальні (virtual). У випадку, якщо похідний клас
не має своїх віртуальних функцій, ці функції автоматично
викликаються із базового класу. Тому в базовому класі вони
повинні бути ОБОВ’ЯЗКОВО! В приведеній нижче програмі цей
випадок продемонстровано на прикладі похідного класу
«пальто» .

29
Приклад:
Приведено базовий клас «одежа» і похідні від
нього класи: «костюм» і «пальто». Загальним
для усіх цих класів є «бренд». В базовому класі
є функції input() , output() для введення та
виведення цієї загальної інформації. В
похідному класі «костюм» також є функції з
цими ж назвами, але вони вводять і виводять
не тільки «бренд», але і іншу інформацію про
костюми. Ці функції об’явлені
віртуальними( virtual).

30
using System;
using System.Collections.Generic;
using System.Text;
namespace clothes1
{
class clothes
{
protected string brand;

public virtual void input()


{
Console.WriteLine("Enter brand");
brand = Console.ReadLine();
}

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;
}

public override void output()


{
Console.WriteLine("For circle square={0}
perimeter={1}",square, perimeter);
}
}

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);
}

public override void output()


{
Console.WriteLine("For rectangle square= {0}
perimeter={1}",square,perimeter);
}

}
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!");

// TODO: Implement Functionality Here

Console.Write("Press any key to continue . . . ");


Console.ReadKey(true);
}
}
}
49

You might also like