Nesneye Yönelik Programlama BM-104 Nesneye Yönelik Programlama Bahar 2013 (6. Sunu) (Yrd. Doç. Dr. Deniz Dal)
Kompozisyon (HAS-A Relationship) Bir x sınıfının bir üye değişkeni bir başka y sınıfının bir nesnesi olabilir. (y HAS-A x) Bu türden bir ilişkiye kompozisyon (composition) denir. Kompozisyon sayesinde küçük basit parçalardan daha sofistike bileşenler elde edebiliriz. Composition is used for objects that have a has-a relationship to each other. A car has-a metal frame, has-an engine, and has-a transmission. A personal computer has-a CPU, a motherboard, and other components. You have-a head, a body, some limbs.
//Uzaydaki Bir Noktayı (Noktanın x ve y Koordinatlarını) //Temsil Eden Kullanıcı Tanımlı Veri Tipi #ifndef NOKTA_H #define NOKTA_H class Nokta { public: Nokta(int=0,int=0); //0, 1 veya 2 Parametreli Yapıcı int GetX(); //x Koordinatını Getir int GetY(); //y Koordinatını Getir void SetX(int); //x Koordinatını Değiştir void SetY(int); //y Koordinatını Değiştir void SetXY(int,int);//x ve y Koordinatlarını Değiştir private: int x;//x Koordinatı int y;//y Koordinatı }; #endif
#include "Nokta.h" Nokta::Nokta(int pX,int pY) { x=pX; y=pY; } int Nokta::GetX() return x; int Nokta::GetY() return y; void Nokta::SetX(int pX) void Nokta::SetY(int pY) void Nokta::SetXY(int pX,int pY) SetX(pX);//x=pX SetY(pY);//y=pY
#include "Nokta.h" #include <iostream> using namespace std; int main() { Nokta n1; //Varsayılan Yapıcı,x=0,y=0 Nokta n2(3); //x=3,y=0 Nokta n3(5,8);//x=5,y=8 Nokta n4; Nokta n5; n4.SetX(25); n4.SetY(34); n5.SetXY(12,16); cout<<'('<<n2.GetX()<<','<<n2.GetY()<<')'<<endl; return 0; }
Atama operatörü int atamalarında farklı bir anlam, nesne atamalarında daha farklı bir anlam taşır. İleriki derslerimizde atama operatörünü aşırı yükleyeceğiz. (Operator Overloading) (Polymorfism nedir?)
Başka Bir Kompozisyon Örneği
Kalıtım/Miras (is-a Relationship) Bir y sınıfı bir x sınıfının tüm üye değişkenleri ve üye fonksiyonlarına ek/ilave olarak başka niteliklere ve davranışlara sahip olabilir. (y IS-A x) Bu türden bir ilişkiye kalıtım/miras (inheritance) denir. Bu durumda x temel sınıf (base class) ve y türetilmiş sınıf (derived class) olarak adlandırılır. (Her y bir x’tir ama her x bir y değildir.) Kalıtım sayesinde daha önceden yazılmış bir kodun yeniden kullanılması sağlanır ve kopyala yapıştıra gerek kalmaz. When creating a class, instead of writing completely new data members and member functions, the programmer can designate that the new class should inherit the members of an existing class. This existing class is called the base class, and the new class is referred to as the derived class. The idea of inheritance implements the is a relationship. For example, mammal IS-A animal, dog IS-A mammal hence dog IS-A animal as well and so on.
#ifndef SEKIL_H #define SEKIL_H class Sekil { public: Sekil();//Varsayılan Yapıcı int GetEn(); int GetBoy(); void SetEn(int); void SetBoy(int); void SetEnBoy(int,int); protected://!!Dikkat!! int en; int boy; }; #endif
#include "Sekil.h" Sekil::Sekil() { en=0; boy=0; } int Sekil::GetEn() return en; int Sekil::GetBoy() return boy; void Sekil::SetEn(int pE) en=pE; void Sekil::SetBoy(int pB) boy=pB; void Sekil::SetEnBoy(int pE,int pB) SetEn(pE);//en=pE SetBoy(pB);//boy=pB
Kalıtım sayesinde kopyala yapıştır ile yeni bir sınıf oluşturmak yerine var olan bir sınıfa yeni üye değişkenler ve/veya üye fonksiyonlar ekleyerek daha kompakt programlar oluştururuz. Bu sayede daha genel bir tanımı daha özel bir hale dönüştürürüz.
#ifndef DIKDORTGEN_H #define DIKDORTGEN_H #include "Sekil.h" class Dikdortgen:public Sekil//Sekil Sınıfından Miras { public: int GetAlan(); }; #endif #include "Dikdortgen.h" int Dikdortgen::GetAlan() return en*boy; }
Her Dikdortgen bir Sekil’dir.
#include "Dikdortgen.h" #include <iostream> using namespace std; int main() { Dikdortgen d; d.SetEn(4); d.SetBoy(6); cout<<"Dikdortgenin Alani: "<<d.GetAlan()<<endl; return 0; }
Kim Kime Ulaşabilir?
Dikdortgen Sınıfından DikdorgenlerPrizmasi Sınıfını Kalıtım Yoluyla Siz Oluşturunuz. (yukseklik Üye Değişkeni ile Hacim Hesaplayan Üye Fonksiyonu Yeni Sınıfınıza Eklemeyi Unutmayınız.)