You are on page 1of 24

ОСНОВНИ ОБЈЕКТНО- ì

ОРИЕНТИРАНИ
КОНЦЕПТИ
ОБЈЕКТНО ОРИЕНТИРАНА АНАЛИЗА И ДИЗАЈН - предавања

Проф. д-р Слободан КАЛАЈЏИСКИ

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Структурно програмирање

Претстава на структурните програми преку црни кутии

1
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Структурно програмирање

int main()
{
int x = 1, y = 5;
printf(‘X + Y = %d\n’, zbir(x,y));
printf(‘X – Y = %d\n’, razlika(x,y));
return 0;
}

int zbir(int a, int b)


{
return a+b;
}

int razlika(int a, int b)


{
return a-b;
}

Користење на глобални податоци кај структурните програми

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Објектно-ориентирано програмирање

ì Класата претставува модел (шаблон) од кој ќе


произлегуваат објектите
ì Објектот претставува еден примерок направен
според моделот (класата)

ì Секој објект има квалитети (наречени атрибути), според


кои лесно може да го разликуваме од другите објекти.
Атрибутите ја дефинираат состојбата на објектот.
ì Објектот може да извршува определени методи/функции
кои исто така се дефинирани во класата. Методите го
дефинираат однесувањето на објектот.

2
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Објектно-ориентирано програмирање

Претставување на класите како шаблони при правењето на објекти

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Објектно-ориентирано програмирање

Атрибутите и методите можат да ги имаат следните


начини на пристап:
ì private: атрибутите и методите од овој тип можат да бидат
повикувани само во внатрешната имплементација на
методите од тој објект;

ì public: атрибутите и методите од овој тип можат слободно


да бидат користени од другите објекти;

ì protected: се дозволува пристап само до одредени објекти


кои се во некаква врска со тој објект.

3
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Објектно-ориентирано програмирање

Кога се пишуваат методите на одредена класа,


треба да се следат следните правила:

ì дефинирање на името на методата;

ì кои параметри ќе се проследат како влез на методата;

ì одредување на повратниот тип (излезот) на методата;

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Објектно-ориентирано програмирање
class Matematika
{ private:
int broj1, broj2;
public:
Matematika(int xx=0, int yy=0)
{ broj1=xx; broj2=yy; }
int zbir()
{ return broj1+broj2; }
int razlika()
{ return broj1-broj2; }
. . .
}
int main()
{
Matematika m(1,5); објект
printf(‘X + Y = %d\n’, m.zbir());
printf(‘X – Y = %d\n’, m.razlika());
return 0; класа
}

Енкапсулација и меѓусебна комуникација помеѓу објектите

4
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Структурно vs. ОО програмирање

ì Главни разлики помеѓу структурното


програмирање и ОО програмирање и се:

ì скривањето на податоците од имплементацијата


на решението (енкапсулацијата)

ì можноста за повторно искористување на


готовиот код на лесен и едноставен начин

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Класи и објекти

Да се напише класа за опишување на вработени во


некоја фирма.
ì Секој вработен треба да се опишува преку
матичниот број, името и презимето, полот и
бројот на бодови за плата.

ì Да се напишат конструкторот, деструкторот,


како и set и get методите за секој
атрибут посебно.

5
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Класи и објекти
class Vraboten
{
private:
char ime[50];
int MBR;
int pol;
float bodovi;
public:
Vraboten(const char *ii=””, int mm=0, int pp=0, float bb=0.0)
{
strcpy(ime, ii);
конструктор MBR = mm;
pol = pp;
bodovi = bb;
}
деструктор ~Vraboten() {};
char *getime() { return ime; };
int getMBR() { return MBR; };
int getpol() { return pol; };
float getbodovi() { return bodovi; };
void setime(const char *ii)
{ strcpy(ime, ii); };
void setMBR(int mm) { MBR = mm; };
void setpol(int pp) { pol = pp; };
void setbodovi(float bb) { bodovi = bb; };
}

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Класи и објекти

Дефинирање на објекти од класата:

Име и презиме МБР пол бодови за плата


Јован Ј. 0101985430019 машки (0) 123.34
Марија М. 2107986450000 женски (1) 223.05
Ана А. 1302984450001 женски (1) не е познато

int main()
{
Vraboten v1(“Jovan J.”, 0101985430019, 0, 123.34);
Vraboten v2(“Marija M.”, 2107986450000, 1, 223.05);
Vraboten v3(“Ana A.”, 1302984450001, 1);
}

6
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Класи и објекти

ì Комуникацискиот механизам помеѓу објектите се


врши преку размена на пораки.

ì На пример ако ОбјектА сака да повика метода од


ОбјектБ, тогаш тој му праќа порака на ОбјектБ.
Одговорот на ОбјектБ кон оваа порака е резултатот
од извршувањето на повиканата метода.

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Класи и објекти

v3.setbodovi(v1.getbodovi());

Комуникација помеѓу објектите преку пораки

7
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Класи и објекти
class Plata
{
private:
int rb;
char ime[50];
float bodovi;
float plata;
public:
Plata(int rr=0, const char *ii=””, float bb=0.0)
{ Објект од тип
rb = rr;
strcpy(ime, ii); Vraboten
bodovi = bb;
plata = bb * 33.00;
}
~Plata() {};
void setPlata(float bod)
{ plata = bodovi * bod; };
void setPlata(const Vraboten &v, float bod)
{ plata = v.getbodovi() * bod; };
float getPlata()
{ return plata; }; Класа за пресметка на
void print()
{ cout<<rb<<”.”<<ime<<bodovi<<plata<<’\n’; }; платата на даден
} вработен.

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Класи и објекти

Повеќе објекти од Plata ќе се користат за генерирање на платен список.

int main()
{
. . .
// se pretpostavuva deka nema poveke od 100 vraboteni
// tekovniot broj na vraboteni se cuva vo promenlivata tekovno

Plata spisok[100];
Vraboten v[100]; //objektite za vraboten se prethodno vneseni
for(int i; i<=tekovno; i++)
spisok[i] = Plata(i, v[i].getime(), v[i].getbodovi());
spisok[i].setPlata(42.00);
. . .
}

8
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Интерфејси и реализација

ì Корисникот не би требало да го гледа било кој дел од


реализацијата на објектот (енкапсулација) – со
објектот комуницира само преку интерфејсот
ì интерфејсите се основно средство за комуникација помеѓу
објектите
ì интерфејсите не содржат атрибути, туку содржат само
методи
ì заштита на атрибутите на објектот – важно при тестирање на
ОО апликации

ì Промена во реализацијата на интерфејсот –


добивање на модуларност на апликацијата

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Интерфејси и реализација

Примери на интерфејси помеѓу објектите

9
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Интерфејси и реализација

class Tragolnik
{
private:
float a, b, c;
public:
Triagolnik(float aa, float bb, float cc)
{ a = aa; b = bb; c = cc; }; float plostina()
~Triagolnik() {};
float plostina() Нова реализација {
{ на методата float p;
float p, s; p = a * (pow(b,2) - sqrt(pow(a/2,2)))/2.0;
s = (a + b + c); return p;
p = s * (s - a) * (s - b) * (s - c);
return p; };
};
}
int main()
{
Triagolnik t(3, 4, 5);
cout<<”Plostinata na triagonikot e:”<<t.plostina();
return 0;
}

ì
АСОЦИЈАЦИИ ПОМЕЃУ
КЛАСИТЕ
ОБЈЕКТНО ОРИЕНТИРАНА АНАЛИЗА И ДИЗАЈН - предавања

Проф. д-р Слободан КАЛАЈЏИСКИ

Универзитет Св. Кирил и Методиј - Скопје

10
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Наследување

ì Преку наследувањето се дозволува


пренесување на атрибутите и
методите од една класа во друга класа

ì Најчесто наследувањето се нарекува isA-релација помеѓу класите

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Наследување

ì Ако имаме две класи Куче и Мачка, и ако сакаме да


направиме хиерархија, тогаш ги бараме заедничките
особини помеѓу припадниците од овие две класи.

ì Очигледно е дека и кучињата и мачките се


миленичиња (припаѓаат на заедничка поголема класа
Милениче), а исто така заеднички атрибути ќе им
бидат breed (раса), size (големина), age (старост),
color (боја)...

11
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Наследување

breed = MALTESE
size = SMALL
age = 7
color = WHITE breed = SIAMESE
size = MEDIUM
age = 3
color = WHITE-BROWN

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Наследување

ATTRIBUTES METHODS
breed eat(what)
size sleep()
age play()
color

METHODS METHODS
bark() meow()
runAfterBall()

Хиерархија помеѓу класите

12
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Наследување

class Pet
{
protected:
char *breed, *size, *color;
int age;
public:
Pet(const char *bb, const char
*ss, const char *cc, int aa)
{
strcpy(breed, bb);
strcpy(size, ss);
strcpy(color, cc);
age = aa;
};
~Pet() {};
void sleep();
void play();
. . .
virtual void eat(what:String)=0;
}

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Наследување
class Dog : public Pet class Cat : public Pet
{ {
private: private:
void bark() void meow()
{ printf(“Au Au!”); } { printf(“Meow meow!”); }

public: public:
void eat(what: String) void eat(what: String)
{ {
if(strcmp(what,”Bone”)) if(strcmp(what,”Fish”))
printf(“Dogs eat bones!”) printf(“Cats eat fish!”)
else else
bark(); meow();
} }
} }

13
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Наследување

Начини на наследување

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Полиморфизам

ì Полиморфизмот значи мноштво на


облици.

ì При наследувањето, сите деца класи ќе ги наследат


интерфејсите од своите родители.

ì Меѓутоа, бидејќи секоја класа е посебна целина, секоја


од нив може да бара одоговор на исто прашање на
начин кој е својствен за самата класа.

14
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Полиморфизам

ì Преоптоварување: промена на имплементацијата на


даден метод од класата родител во класата дете.
ì Пример: класата Pet има функција eat(what). Класите
Cat и Dog треба да имплементираат свои функции.
Мачките јадат риба, кучињата коски.

Во случај кога преоптоварувањето мора да се случи кај деца-класите, односно во


родител-класата не се наведе имплементацијата на одредена метода, тогаш викаме
дека имаме апстракција, односно родител-класата се нарекува апстрактна класа.

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Полиморфизам
Да се дефинира хиерархија на луѓе. За секој човек треба
да се водат податоци за името и презимето, матичниот
број и адресата на живеење. Од оваа класа треба да се
изведат две класи: студент (индекс и просек) и професор
(плата).
Да се обезбеди интерфејс за печатење на податоците за
студентите и вработените во следниот формат:

- име и презиме, индекс...............................за студентите

- име и презиме, матичен број, плата.........за професорите

15
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Полиморфизам
class Covek
{
protected:
char *ime, *prezime, *adresa;
int MBR;
public:
Covek(const char *ii, const char *pp, const char *aa, int mm)
{
strcpy(ime, ii);
strcpy(prezime, pp);
strcpy(adresa, aa);
MBR = mm;
};
~Covek() {};
char *getIme();
char *getPrezime();
int getMBR();
. . .
virtual void pecati()=0;
}

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Полиморфизам
class Student : public Covek
{
private:
int indeks;
float prosek;
public:
Student() {}; //soodvetna implementacija na konstruktorot
~Student() {};
// soodvetna implementacija na virtuelnata metoda
void pecati()
{ cout<<getIme()<<” “<<getPrezime()<<” “<<indeks<<’\n’; };
}

class Profesor : public Covek


{
private:
float plata;
public:
Profesor() {}; //soodvetna implementacija na konstruktorot
~Profesor() {};
// soodvetna implementacija na virtuelnata metoda
void pecati()
{ cout<<getIme()<<” “<<getPrezime()<<’\n’;
cout<<getMBR()<<” ”<<plata<<’\n’; };
}

16
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Полиморфизам

Да се развие класа Форма во која ќе се нуди метода за


пресметка на плоштина на различни геометриски
форми.

Да се направи хиерархија со која ќе се обезбеди


пресметка на плоштина на круг, триаголник и
правоаголник.

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Полиморфизам

Хиерархија на геометриски форми и пресметка на плоштина

17
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Полиморфизам
class Forma class Krug : public Forma
{ {
public: private:
virtual float plostina()=0; float r;
} public:
Krug(float rr=0.0)
class Triagolnik : public Forma { r = rr; };
{ ~Krug() {};
private:
float a, b, c; float plostina()
public: { return 3.1415*r*r; };
Triagolnik(float aa=0.0, float }
bb=0.0, float cc=0.0)
{ a=aa; b=bb; c=cc; }; class Pravoagolnik : public Forma
~Triagolnik() {}; {
private:
float a, b;
float plostina() public:
{ Pravoagolnik(float aa=0.0, float bb=0.0)
float pl, s; { a=aa; b=bb; };
s=a+b+c; ~Pravoagolnik() {};
pl=s*(s-a)*(s-b)*(s-c)/2.0;
return pl; float plostina()
}; { return a*b; };
} }

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Полиморфизам

ì Доколку родител-класата е апстрактна, и деца-


класите кои ќе се изведат од оваа класа ќе бидат
исто така апстрактни класи ако не извршат
преоптоварување на имплементацијата на
виртуелните методи од родител-класата.

18
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Композиција

ì Композицијата е асоцијација помеѓу


објектите (класите) преку која еден објект
(класа) во својот состав вклучува –
вгнездува друг објект (класа).

ì Преку композицијата се добиваат сложени објекти.

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

Композиција

Составни елементи на персонален компјутер

19
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Композиција

Да се напишат потребните класи за дефинирање на


триаголник во рамнина. Триаголникот се дефинира преку
неговите темиња.
При дефинирањето на триаголникот,
да се внимава дали внесените
точки како негови темиња
може да формираат
триаголник.

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Композиција
class Point
{
private:
int x,y;
public:
Point(int xx = 0, int yy = 0)
{ x=xx;
y=yy; };
~Point() {};

void print()
{ printf(“(%d,%d)”,x,y); }

float distance(const Point &p)


{ return sqrt((x-p.x)*(x-p.x) + (y-p.y)*(y-p.y)); }
}

20
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Композиција
class Triangle
{
private:
Point p1,p2,p3;
public:
Triangle(Point &pp1, Point &pp2, Point &pp3)
{
if(pp1.distance(pp2) + pp1.distance(pp3) > pp2.distance(pp3) &&
pp1.distance(pp2) + pp2.distance(pp3) > pp1.distance(pp3) &&
pp2.distance(pp3) + pp1.distance(pp3) > pp1.distance(pp2))
{
p1=pp1;
p2=pp2;
p3=pp3;
}
else
{
printf(“These points don’t define triangle”)
}
};
~Triangle() {};
}

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Композиција

Да се напишат потребните класи со кои ќе се опише


полагање на испит од страна на студент.
Потоа во главната програма, под претпоставка дека во
дадена низа се сместени податоците за положените
испити од страна на различни студенти, да се даде
моменталниот просек на студентот со број на индекс
401.

21
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Композиција

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Композиција

class Student class Predmet


{ {
private: private:
char *ime, *prezime; char *ime;
int indeks; int sem;
public: public:
Student(const char *ii=””, Predmet(const char *ii=””,
const char *pp=””, int nn=0) int ss=0)
{ {
strcpy(ime, ii); strcpy(ime,ii);
strcpy(prezime, pp); sem=ss;
indeks=nn; };
}; ~Predmet() {};
~Student() {}; }
int getIndeks()
{ return indeks; };
}

22
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ПРИМЕР - Композиција
class Polaganje int main()
{ {
private: . . .
int ocenka; Polaganje p[100];
Date datum; // naredbi za popolnuvanje na
Student *s; podatocite za polaganjeto
Predmet *p; . . .
public: float prosek=0.0;
Polaganje(int oo=0, Date dd, int kolku=0;
Student &ss, Predmet &pp) for(int i=0;i<100;i++)
{ {
if(oo<5)&&(oo>10) ocenka=5; if (p[i].s->getIndeks()==401)
else ocenka=oo; {
datum=d; kolku++;
s = &ss; prosek+=p[i].getOcenka();
p = &pp; };
}; };
~Polaganje() {}; cout<<”Prosekot na studentot so
int getOcenka() indeks 401
{ return ocenka; }; e:”<<prosek/kolku<<’\n’;
} return 0;
}

С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ЗАДАЧA ЗА ВЕЖБАЊЕ

ì Да се напише програма за работа со геометриски


форми. За секоја форма треба да се води типот на
формата, како и методи за пресметка на плоштина и
периметар. Во главната програма да се креира низа
од објекти од родителската класа, со максимум 100
објекти. Да се пополни низата со различни
геометриски форми, и да се обезбеди печатење на
елементите од низата во следниот формат: тип на
формата, плоштина и периметар на формата. Да се
работи со геометриските форми триаголници, кругови
и правоаголници.

23
С. Калајџиски Објектно Ориентирана Анализа и Дизајн - предавања

ЗАДАЧА ЗА ВЕЖБАЊЕ
#include<iostream> class Triagolnik : public Forma
using namespace std; {
private:
class Forma float a, b, c;
{ public:
protected: Triagolnik(float aa=0.0, float bb=0.0, float
cc=0.0):Forma("TRIAGOLNIK")
char *tipForma; { a=aa; b=bb; c=cc; };
public: ~Triagolnik() {};
Forma(char *tip)
{ tipForma = new char[strlen(tip)+1]; float plostina()
strcpy(tipForma,tip); {
}; float pl, s;
~Forma() {}; s=(a+b+c)/2.0;
char *getTip() { return tipForma; }; pl=sqrt(s*(s-a)*(s-b)*(s-c));
return pl;
virtual float plostina()=0; };
virtual float perimetar()=0;
}; float perimetar()
{ return a+b+c; };
};
class Krug : public Forma
{ class Pravoagolnik : public Forma
{
private: private:
float r; float a, b;
public: public:
Krug(float rr=0.0):Forma("KRUG") Pravoagolnik(float aa=0.0, float
{ r = rr; }; bb=0.0):Forma(”PRAVOAGOLNIK")
{ a=aa; b=bb; };
~Krug() {}; ~Pravoagolnik() {};
float plostina()
{ return 3.1415*r*r; }; float plostina()
{ return a*b; };

float perimetar()
{ return 2*(a+b); };
float perimetar() };
{ return 2.0*3.1415*r; };
};

24

You might also like