Nesneye y nel k programlama kalitim
This presentation is the property of its rightful owner.
Sponsored Links
1 / 47

NESNEYE YÖNELİK PROGRAMLAMA KALITIM PowerPoint PPT Presentation


  • 189 Views
  • Uploaded on
  • Presentation posted in: General

NESNEYE YÖNELİK PROGRAMLAMA KALITIM. Özlem AYDIN Trakya Üniversitesi Bilgisayar Mühendisliği Bölümü. Not: Bu sunumda Doç. Dr. Yılmaz KILIÇASLAN’ın Nesneye Yönelik Programlama dersi sunumlarından faydalanılmıştır. Sunum Planı. Temel ve türetilmiş sınıflar

Download Presentation

NESNEYE YÖNELİK PROGRAMLAMA KALITIM

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Nesneye y nel k programlama kalitim

NESNEYE YÖNELİK PROGRAMLAMAKALITIM

Özlem AYDIN

Trakya Üniversitesi

Bilgisayar Mühendisliği Bölümü

Not: Bu sunumda Doç. Dr. Yılmaz KILIÇASLAN’ın Nesneye Yönelik Programlama dersi sunumlarından faydalanılmıştır.


Sunum plan

Sunum Planı

  • Temel ve türetilmiş sınıflar

  • Temel sınıfların elemanlarının yeniden tanımlanması

  • Temel ve türetilmiş sınıflar arasında dönüşüm

  • Erişim kuralları

  • Yapıcı ve yıkıcı fonksiyonların çağrılma sırası

  • Çoklu kalıtım

  • Üst sınıf yapıcı fonksiyonlarına parametre geçirilmesi


S n flar aras ndaki li kiler 1

Sınıflar Arasındaki İlişkiler - 1

  • C++, yeni veri tipleri tanımlamayı kolaylaştırmanın yanında, bu veri tipleri arasında çeşitli ilişkilerin kurulmasına da olanak sağlar.

  • Aşağıdaki cümlelere bakarak, sınıflar arasında ne tür ilişkiler olabileceğini belirleyiniz:

    • A daisy is a kind of flower.

    • A rose is a (different) kind of flower.

    • Red roses and yellow roses are both kinds of roses.

    • A petal is a part of both kinds of flowers.

    • Ladybugs eat certain pests such as aphids, which may be infesting certain kinds offlowers.


S n flar aras ndaki li kiler 2

Sınıflar Arasındaki İlişkiler - 2

  • In all, there are three basic kinds of class relationships ... The first of these isgeneralization/specialization, denoting an "is a" relationship. For instance, a rose is a kind offlower, meaning that a rose is a specialized subclass of the more general class, flower. Thesecond is whole/part, which denotes a "part of" relationship. Thus, a petal is not kind of aflower; it is a part of a flower. The third is association, which denotes some semanticdependency among otherwise unrelated classes, such as between ladybugs and flowers. Asanother example,roses and candles are largely independent classes, but they both representthings that we might use to decorate a dinner table. (Booch, G. 1998)


S n flar aras ndaki li kiler 3

Sınıflar Arasındaki İlişkiler - 3

  • C++’ta, sınıflar arasındaki genel/özel (“is a”) ilişkisi ve bundan kaynaklı türlü işlevsellikler:

    • bir veri tipini bir diğerinin alt-tipi olarak tanımlamaya imkan veren kalıtım / miras (“inheritance”) mekanizması ve

    • birbiriyle ilişkili veri tiplerini bir arada kullanmaya imkan veren çok-biçimlilik (“polymorphism”) mekanizması ile kurulur.

  • Bu iki mekanizmadan birincisi bu dersin, ikincisi ise gelecek dersin konusu olacaktır.


Veriler aras li kilerin c de fadesi 1

Veriler Arası İlişkilerin C’de İfadesi - 1

  • Bir şirketin,

    • düzenli işçiler,

    • satış elemanları

    • yöneticiler

      gibi çalışanlarının olduğunu ve bu çalışanlar hakkındaki bilgileri tutan bir programa ihtiyacımız olduğunu varsayalım.


Veriler aras li kilerin c de fadesi 2

Veriler Arası İlişkilerin C’de İfadesi - 2

  • Eğer programı C dilini kullanarak yazacaksak, bir yaklaşım isim, doğum tarihi ve sosyal sigorta numarası gibi eleman sahaları olan calisan isimli bir yapı (structure) tanımlamak olabilir.

  • Fakat, her tip çalışanın az da olsa farklı bilgileri gerektireceği, bir sorun olarak karşımıza çıkacaktır. Örneğin, düzenli bir işçinin ücreti, çalıştığı toplam saat miktarı ve saat ücreti; satış elemanın ücreti, normal ücret artı yaptığı her satış için aldığı komisyon üzerinden hesaplanırken; yöneticinin, haftalık sabit bir ücreti olabilecektir.


Veriler aras li kilerin c de fadesi 3

Veriler Arası İlişkilerin C’de İfadesi - 3

  • Her tip çalışan için ayrı bir yapı tanımlamak bir başka yaklaşım olabilir. Fakat, bu durumda herhangi bir çalışanı girdi olarak bekleyen bir fonksiyon yazmak mümkün olmayacaktır.

  • Bir diğer alternatif calisan yapısını bütün olası sahaları barındıracak şekilde tanımlamak olacaktır. Bu ise her çalışan için boş sahalar olması nedeniyle gereksiz alan kullanımına yol açacaktır.

  • C’de bir çözüm “union” içeren bir yapı tanımlamak olacaktır.


Veriler aras li kilerin c de fadesi 4

Veriler Arası İlişkilerin C’de İfadesi - 4

// Iliskili verilerin C’de ifade edilmesine örnek

structisci_ucreti

{float saat_ucreti;

floatcalisma_suresi; }

structsatis_elemani_ucreti

{float saat_ucreti;

floatcalisma_suresi;

float komisyon;

floatsatis_miktari; }

structyonetici_ucreti

{floathaftalik_ucret; }


Veriler aras li kilerin c de fadesi 5

Veriler Arası İlişkilerin C’de İfadesi - 5

enum CALISAN_TIPI {ISCI, SATIS_ELEMANI, YONETICI};

structcalisan

{ char isim[30];

CALISAN_TIPI tip;

union

{

structisci_ucretiucretli_calisan;

structsatis_elemani_ucreti

komisyonla_calisan;

structyonetici_ucreti

haftalik_ucretli; };

};


Veriler aras li kilerin c de fadesi 6

Veriler Arası İlişkilerin C’de İfadesi - 6

// Iliskili verilerin C’de ifade edilmesine ornek:

floatodeme_hesapla( structcalisan *emp )

{

switch ( emp->tip )

{ case ISCI:

returnemp->ucretli_calisan.saat_ucreti *

ucretli_calisan.calisma_suresi;

break;

case SATIS_ELEMANI:

returnemp->komisyonla_calisan.saat_ucreti *

komisyonla_calisan.calisma_suresi +

komisyonla_calisan.komisyon *

komisyonla_calisan.satis_miktari;

break;

case YONETICI:

returnemp->haftalik_ucretli.haftalik_ucret;

break;

// ...

};

}


Veriler aras li kilerin c da fadesi 1

Veriler Arası İlişkilerin C++’da İfadesi - 1

  • Çalışanlara ilişkin verileri tutan programı C++’da yazdığımızı varsayalım. İlk olarak, bütün çalışanların ortak özelliklerini betimleyen Calisan adlı bir sınıf tanımlarız:

    classCalisan

    { public:

    Calisan();

    Calisan( constchar *nm );

    char *isimSoyle() const;

    private:

    char isim[30];};

    Örneği basitleştirmek için bu sınıf yalnızca çalışanın ismini tutmaktadır. Elbette, doğum tarihi, sosyal sigorta numarası ve adres gibi birçok diğer özelliği de kodlayabilirdi.


Veriler aras li kilerin c da fadesi 2

Veriler Arası İlişkilerin C++’da İfadesi - 2

  • Bir sonraki adımda özel tipte bir çalışanı, UcretliCalisan sınıfını tanımlarız. Bu sınıftakiler bütün çalışanların ortaklaşa sahip olduğu özellikleri ve bazı fazladan özellikleri taşıyacaklardır.

  • UcretliCalisan sınıfını tanımlarken, Calisan sınıfını iki şekilde kullanabiliriz:

    • Calisan nesnesini UcretliCalisan sınıfının bir eleman nesnesi yapabiliriz veya

    • UcretliCalisan sınıfını Calisan sınıfının bir alt-sınıfı olarak tanımlayabiliriz.


Veriler aras li kilerin c da fadesi 3

Veriler Arası İlişkilerin C++’da İfadesi - 3

  • Sınıf türetimi için genel format:

    class türetilmiş_sınıf_ismi : türetim_modu temel_sınıf_ismi

    {

    // Sınıf Gövdesi

    };

    classUcretliCalisan : publicCalisan

    {

    // Sınıf Gövdesi

    };


Veriler aras li kilerin c da fadesi 4

Veriler Arası İlişkilerin C++’da İfadesi - 4

// Calisansinifinin bir alt-sinifi

classUcretliCalisan : publicCalisan

{ public:

UcretliCalisan( constchar *nm );

voidUcretBelirle( floatucrt );

voidSureBelirle( floatst );

private:

floatucret;

float saat;

};

Türetilmiş bir sınıfın bildiriminde onu temel sınıftan ayıran özellikler kodlanır.


Veriler aras li kilerin c da fadesi 5

Veriler Arası İlişkilerin C++’da İfadesi - 5

  • UcretliCalisansınıfının her bir nesnesi kendisi için tanımlanmışlara ek olarak Calisan sınıfının da eleman sahalarını içerir. Bir UcretliCalisannesnesi için Calisansınıfının daUcretliCalisansınıfının da eleman fonksiyonları çağrılabilir:

    UcretliCalisanisci( “Ali Uzun” );

    char *str;

    isci.sureBelirle( 40.0 );

    str = isci.isimSoyle();


Veriler aras li kilerin c da fadesi 6

Veriler Arası İlişkilerin C++’da İfadesi - 6

  • Türetilmiş bir sınıf temel sınıfın özel korumalı (private) eleman sahalarına erişemez:

    voidUcretliCalisan: :isimYaz() const

    { cout << “İscinin ismi: “

    << isim << ‘\n’; // Error}

  • Bu kısıt sarmalama (encapsulation) prensibinin bir gereğidir. Türetilmiş bir sınıf da temel sınıfın açık korumalı (public) arayüzünü kullanmalıdır:

    voidUcretliCalisan: :isimYaz() const

    { cout << “İscinin ismi: “

    << isimSoyle() << ‘\n’; }


Veriler aras li kilerin c da fadesi 7

Veriler Arası İlişkilerin C++’da İfadesi - 7

  • C++ örneğimizi, C örneğimize daha çok benzer kılmak için, satış elemanlarını ve yöneticileri betimleyen sınıflar tanımlamalıyız. Satış elemanları bir tür ücretli çalışan olduğu için SatisElemani sınıfını UcretliCalisan sınıfından türetebiliriz:

    classSatisElemani : publicUcretliCalisan

    {

    public:

    SatisElemani( constchar *nm );

    voidkomisyonBelirle(float kom);

    voidsatislariBelirle(floatsatislar);

    private:

    float komisyon;

    floatsatisMiktari;

    };


Veriler aras li kilerin c da fadesi 8

Veriler Arası İlişkilerin C++’da İfadesi - 8

  • Bir SatisElemaninesnesi,Calisanve UcretliCalisansınıflarının bütün eleman sahalarını içerir. Bu üç sınıfın herhangi bir eleman fonksiyonu bir SatisElemani nesnesi için çağrılabilir.

  • Ayrıca, SatisElemani sınıfının hem türetilmiş hem de temel bir sınıf işlevi gördüğüne dikkat ediniz. C++’da istenilen sayıda kalıtım düzeyi tanımlanabilir.


Veriler aras li kilerin c da fadesi 9

Veriler Arası İlişkilerin C++’da İfadesi - 9

  • Yöneticiler, sabit maaşlı çalışanlardır. Dolayısıyla, Yönetici sınıfı, Calisan sınıfından aşağıdaki şekilde türetilebilir:

    classYonetici : publicCalisan

    {

    public:

    Yonetici(constchar *nm);

    voidmaasBelirle(floatmaas);

    private:

    floathaftalikMaas;

    };


Veriler aras li kilerin c da fadesi 10

Veriler Arası İlişkilerin C++’da İfadesi - 10

  • Dört sınıf arasında tanımlamış olduğumuz kalıtım ilişkisi şematik olarak aşağıdaki gibi gösterilebilir:

Calisan

UcretliCalisan

Yonetici

SatisElemanı


Temel s n f n elemanlar n yeniden tan mlama 1

Temel Sınıfın Elemanlarını Yeniden Tanımlama - 1

  • Şimdi çalışanlara yapılacak haftalık ödemelerin nasıl hesaplanacağına bakalım. İlk olarak UcretliCalisan sınıfı için bir odemeHesapla eleman fonksiyonu tanımlayabiliriz:

    floatUcretliCalisan::odemeHesapla() const

    {

    returnucret * saat;

    }


Temel s n f n elemanlar n yeniden tan mlama 2

Temel Sınıfın Elemanlarını Yeniden Tanımlama - 2

  • SatisElemani sınıfı için de bir odemeHesapla eleman fonksiyonu tanımlayabiliriz. Fakat, bu fonksiyon üst sınıfının özel korumalı elemanlarına erişemeyeceği için, aşağıdaki tarzda bir kodlama hata üretecektir:

    floatSatisElermani::odemeHesapla() const

    {

    returnucret*saat + komisyon*satisMiktari; //Error

    }


Nesneye y nel k programlama kalitim

Temel Sınıfın Elemanlarını Yeniden Tanımlama - 3

  • Üst sınıfın açık korumalı bir eleman fonksiyonunu çağırmalıyız. Fakat, bu da sorunu çözmeyecektir:

    floatSatisElemani::odemeHesapla() const

    {

    returnodemeHesapla() +

    komisyon * satisMiktari;

    }

  • Yukarıdaki fonksiyondaki (semantik) sorunu tespit ediniz.


Temel s n f n elemanlar n yeniden tan mlama 4

Temel Sınıfın Elemanlarını Yeniden Tanımlama - 4

  • Derleyici odemeHesapla ifadesiyle SatisElemani sınıfının ilgili fonksiyonunun çağrıldığını varsayacak ve bu da sonsuz özyinelemeye yol açacaktır.

  • Üst-sınıfın fonksiyonuna erişmek içim kapsam çözümleme operatörünü (::) kullanmak gerekecektir:

    floatSatisElermani::odemeHesapla() const

    {

    returnUcretliCalisan::odemeHesapla() +

    komisyon * satisMiktari;

    }


Temel s n f n elemanlar n yeniden tan mlama 5

Temel Sınıfın Elemanlarını Yeniden Tanımlama - 5

  • Özetle, türetilmiş sınıfın bir nesnesi için yeniden tanımlanmış bir fonksiyon çağrıldığında, fonksiyonun türetilmiş sınıfa ait olan versiyonu kullanılır:

    SatisElemanisatici( “oya özsoy” );

    satici.saatBelirle( 40.0 );

    satici.ucretBelirle( 6.0 );

    satici.komisyonBelirle( 0.05 );

    satici.satislariBelirle( 2000.0 );

    // Saticinin toplam maashesaplamasi

    cout << “Saticininmaasi: “

    << satici.odemeHesapla() << ‘\n’;

    // Saticinin baz maashesaplamasi

    cout << “Saticinin baz maasi: “

    << satici.UcretliCalisan::odemeHesapla()

    << ‘\n’;


Nesneye y nel k programlama kalitim

Temel Sınıfın Elemanlarını Yeniden Tanımlama - 6

  • Yonetici sınıfı için de bir odemeHesapla fonksiyonu tanımlayabiliriz:

    floatYonetici::odemeHesapla()const

    {

    returnhaftalikMaas;

    }

    Bu fonksiyon UcretliCalisan veya SatisElemani sınıflarında tanımlı benzer isimli fonksiyonların yeniden tanımlanmasına yol açmayacaktır; çünkü bu sınıfların ikisi de Yonetici sınıfı ile bir temel ya da türetilmiş sınıf ilişkisi içinde değillerdir.


Temel ve t retilmi s n flar aras nda d n m 1

Temel ve Türetilmiş Sınıflar Arasında Dönüşüm - 1

  • C++, örtük olarak bir türetilmiş sınıf nesnesinin temel sınıf nesnesine dönüştürülmesine izin verir:

    UcretliCalisanisci;

    SatisElemanisatici;

    isci = satici; // türetilmiş => temel

  • Fakat, ters yönlü dönüşüm mümkün değildir:

    satici = isci; // Error


Temel ve t retilmi s n flar aras nda d n m 2

Temel ve Türetilmiş Sınıflar Arasında Dönüşüm - 2

  • Aynı zamanda türetilmiş sınıf nesnesine işaret eden bir işaretçi temel sınıf nesnesine işaret eden bir işaretçiye dönüştürülebilir:

    Calisan *c_ptr;

    UcretliCalisanisci(“Ali Uzun”);

    SatisElemanisatici(“Ayse Akman”);

    Yonetici patron(“Mehmet Baycan”);

    // UcretliCalisan * => Calisan *

    c_ptr = &isci;

    // SatisElemani * => Calisan *

    c_ptr = &satici;

    // Yonetici * => Calisan *

    c_ptr = &patron;


Temel s n flara eri im kontrol

Temel sınıflara erişim kontrolü

class türetilmiş_sınıf_ismi : türetim_modu temel_sınıf_ismi

{

// Sınıf Gövdesi

};

  • Burada türetim_moduyerine şu üç anahtar kelimeden bir tanesi yazılabilir: public, private ve protected.


Protected eri im t r

Protected erişim türü

  • Bazı durumlarda bir özellik veya metodun dışarıya kapalı olması ancak o sınıftan türeyenlere açık olması istenebilir. Bu durumda 'protected' erişim belirleyicisi kullanılır.

  • Temel sınıfa ait protected üyelere, bu sınıftan türetilmiş sınıflara ait üyeler erişebilir. Temel sınıfın veya türetilmiş sınıfların dışından bu protected üyelere erişilemez.

  • Protected erişim türü sınıf içerisinde herhangi bir yerde bulunabilir.

    class sınıf_ismi

    {

    //private üyeler

    protected: //opsiyonel

    //protected üyeler

    public:

    //public üyeler

    };


Eri im kurallar 1

Erişim Kuralları - 1

  • Kalıtım hiyerarşisi içinde organize olmuş sınıflar arasındaki erişim kuralları aşağıdaki gibidir:

    • Bir sınıfa ait private elemanlara, arkadaş sınıf ve fonksiyonlar haricinde, dışarıdan erişmek mümkün değildir.

    • Bir alt sınıf, türetildiği sınıfın public ve protected elemanlarına erişebilir.

    • Türetiliş modupublic ise, üst sınıfa ait public ve protected elemanlar alt sınıfın da sırasıyla public ve protected elemanları olurlar.

    • Türetiliş moduprivate ise üst sınıfa ait public ve protected elemanlar alt sınıfın private elemanları olurlar.

    • Türetiliş moduprotected ise üst sınıfa ait public ve protected elemanlar alt sınıfın protected elemanları olurlar.

    • Türetiliş modu belirtilmemiş ise, türetilen sınıf ise varsayılan türetimmoduprivate, türetilen yapı ise varsayılan türetimmodupublic olur.


Eri im kurallar 2

Erişim Kuralları - 2

#include <iostream>

usingnamespacestd;

class Personel

{public:

Personel(){ cout << “Yap.Fonk.–Personel!\n”; }

~Personel(){cout << “Yik.Fonk.-Personel!\n”; }

};

class Akademisyen : private Personel

{public:

Akademisyen() {cout <<“Yap.Fonk.–Akademisyen!\n”;}

~Akademisyen(){cout << “Yik.Fonk.–Akademisyen!\n”; }

};

classIdari : private Personel

{public:

Idari() {cout << “Yap.Fonk.–Idari!\n”; }

~Idari() {cout << “Yik.Fonk.–Idari!\n”; }

};


Eri im kurallar 3

Erişim Kuralları - 3

classArasGor : public Akademisyen

{ public:

ArasGor() {cout << “Yap.Fonk.-ArasGor!\n”; }

~ArasGor(){cout << “Yik.Fonk.–ArasGor!\n”; }

};

classOgrGor : public Akademisyen

{ public:

OgrGor() { cout << “Yap.Fonk.–OgrGor!\n”; }

~OgrGor() {cout << “Yik.Fonk.–OgrGor!\n”; }

};

intmain()

{

OgrGorservetSenyucel; cout << “MAIN!”;

return 0;

}


Eri im kurallar 4

Erişim Kuralları - 4

  • Aşağıdaki ifadeleri Doğru veya Yanlış olarak sınıflayınız:

    • Akademisyen sınıfından Personel sınıfının private elemanlarına erişilemez.

    • Akademisyen sınıfından Personel sınıfının public ve protectedelemanlarına erişilemez.

    • Araştırma-Görevlisi sınıfından Akademisyen sınıfının private elemanlarına erişilemez.

    • Araştırma-Görevlisi sınıfından Akademisyen sınıfının public ve protectedelemanlarına erişilemez.

    • Araştırma-Görevlisi sınıfından Personel sınıfının private elemanlarına erişilebilir.

    • Araştırma-Görevlisi sınıfından Personel sınıfının public ve protectedelemanlarına erişilebilir.

    • Araştırma-Görevlisi sınıfından türetilmiş bir başka sınıf olsaydı, Akademisyen sınıfının public ve protectedelemanlarına erişemeyecekti.


Kal t m ve yap c y k c fonksiyonlar

Kalıtım ve Yapıcı / Yıkıcı Fonksiyonlar

  • Kalıtım söz konusu olduğunda yapıcı ve yıkıcı fonksiyonlara ilişkin iki sorunun cevaplanması gerekir:

  • Temel sınıf ve türetilmiş sınıf yapıcı ve yıkıcı fonksiyonları ne zaman çağrılır?

  • Temel sınıfın yapıcı fonksiyonlarına parametre nasıl geçirilir?


Yap c ve y k c fonksiyonlar n a r l s ras

Yapıcı ve Yıkıcı Fonksiyonların Çağrılış Sırası

  • Yapıcı fonksiyonların çağrılışında öncelik temel sınıflarda, yıkıcı fonksiyonların çağrılışında öncelik türetilmiş sınıflardadır.

  • Bir önceki programın çıktısı aşağıdaki gibi olacaktır.

    Yap.Fonk.-Personel!

    Yap.Fonk.-Akademisyen!

    Yap.Fonk.-OgrGor!

    MAIN!

    Yik.Fonk.-OgrGor!

    Yik.Fonk.-Akademisyen!

    Yik.Fonk.-Personel!


Oklu kal t m 1

Çoklu Kalıtım - 1

  • Kalıtım yapısı içerisinde bir sınıfın bağlı olduğu temel sınıf sayısı üzerinde herhangi bir kısıtlama yoktur. Bir sınıf, birden fazla sınıf için baz sınıf olabilir.

  • Diğer yandan, herhangi bir sınıf da birden fazla sınıftan türetilmiş olabilir. Bu duruma çoklu kalıtım denir.

  • Çoklu kalıtım söz diziminin genel formatı:

    class türetilmiş_sınıf_ismi : türetim_modu1 temel_sınıf_ismi1,

    türetim_modu2 temel_sınıf_ismi2,

    . . .

    türetim_moduN temel_sınıf_ismiN

    {

    // Sınıf Gövdesi

    };


Oklu kal t m 2

Çoklu Kalıtım - 2

#include <iostream>

usingnamespacestd;

class Personel

{public:

Personel(){ cout << “Yap.Fonk.–Personel!\n”; }

~Personel(){cout << “Yik.Fonk.-Personel!\n”; }

};

class Akademisyen : public Personel

{public:

Akademisyen(){cout <<“Yap.Fonk.–Akademisyen!\n”; }

~Akademisyen(){cout<<“Yik.Fonk.–Akademisyen!\n”;}

};


Oklu kal t m 3

Çoklu Kalıtım - 3

classIdari : public Personel

{public:

Idari() {cout << “Yap.Fonk.–Idari!\n”; }

~Idari() {cout << “Yik.Fonk.–Idari!\n”; }

};

class Bolum_Baskani : public Akademisyen, publicIdari

{ public:

Bolum_Baskani() {cout << “Yap.Fonk.-B_Baskan!\n”; }

~Bolum_Baskani(){cout<<“Yik.Fonk.–B_Baskan!\n”; }

};

intmain()

{

Akademisyen akademisyen1;

Idari idari1;

Bolum_Baskanibaskan;

return 0;

}


Oklu kal t m 4

Çoklu Kalıtım - 4

  • Program Çıktısı:

    Yap.Fonk.-Personel

    Yap.Fonk.-Akademisyen

    Yap.Fonk.-Personel

    Yap.Fonk.-Idari

    Yap.Fonk.-Personel

    Yap.Fonk.-Akademisyen

    Yap.Fonk.-Personel

    Yap.Fonk.-Idari

    Yap.Fonk.-Bolum_Baskani

    . . .


Oklu kal t m 5

Çoklu Kalıtım - 5

  • Kalıtım hiyerarşisi içerisinde herhangi bir nesne için bir defadan fazla kullanılan sınıflarla karşılaşmak istemiyorsak bu sınıfları sanal baz sınıf olarak tanımlarız. Mevcut sözdiziminde, doğrudan türetilmiş sınıf tanımlamaları içerisinde kullanılan baz sınıf adlarının başına virtual ayrılmış kelimesi getirilerek baz sınıflar sanal baz sınıflara dönüştürülebilir:

    class Personel

    {public:

    Personel(){ cout << “Yap.Fonk.–Personel!\n”;

    ... }

    };

    class Akademisyen : publicvirtual Personel

    {public:

    Akademisyen(){cout <<“Yap.Fonk.–Akademisyen!\n”; }

    ... }

    };


Oklu kal t m 6

Çoklu Kalıtım - 6

classIdari : publicvirtual Personel

{public:

Idari() {cout << “Yap.Fonk.–Idari!\n”; }

... }

};

class Bolum_Baskani:public Akademisyen,publicIdari

{

public:

Bolum_Baskani(){cout<<“Yap.Fonk.Bolum_Baskani!\n”; }

... }

};

intmain()

{

Bolum_Baskanibaskan;

return 0;

}


Oklu kal t m 7

Çoklu Kalıtım - 7

  • Program Çıktısı:

    Yap.Fonk.-Personel

    Yap.Fonk.-Akademisyen

    Yap.Fonk.-Idari

    Yap.Fonk.-Bolum_Baskani

    . . .


Temel s n f n yap c fonksiyonuna parametre ge irilmesi 1

Temel Sınıfın Yapıcı Fonksiyonuna Parametre Geçirilmesi -1

  • Temel sınıfların yapıcı fonksiyonlarına parametre geçirme işlemi türetilmiş sınıfın yapıcı fonksiyon bildirimini genişletmek suretiyle gerçekleştirilir. Bu genişletmenin genel formatı aşağıdaki gibidir:

    türetilmiş-yapıcı(arg-list):temel1(arg-list),

    temel2(arg-list),

    // ...

    temelN(arg-list)

    {

    // Türetilmiş Yapıcı Fonksiyonun Gövdesi

    }

  • Genel olarak, türetilmiş sınıf yapıcı fonksiyonu hem kendi ihtiyacı olan hem de temel sınıfın gereksindiği parametreleri alır. Temel sınıfın gereksindikleri, yani : işaretinden sonra listelenenler, temel sınıf yapıcı fonksiyonuna geçirilir.


Temel s n f n yap c fonksiyonuna parametre ge irilmesi 2

Temel Sınıfın Yapıcı Fonksiyonuna Parametre Geçirilmesi -2

#include <iostream>

usingnamespacestd;

class temel

{ protected:

int i;

public:

temel(int x) {i = x; cout << “Yapici-temel\n”;}

~temel() {cout << “Yikici-temel\n”;} };

classturetilmis : temel

{ int j;

public:

turetilmis(int x, int y) : temel(y)

{j = x; cout << “Yapici-turetilmis\n”;}

~turetilmis() {cout << “Yikici-turetilmis\n”;}

voidgoruntule(){cout << i << “ “ << j << “\n”;}};

intmain()

{ turetilmisob(3, 4);

ob.goruntule();

return 0; }


Nesneye y nel k programlama kalitim

Özet

  • Sınıflar arasında, asosiyasyon (association), parça-bütün (part-whole / has_a) ve genel-özel (generalization/specialization / is_a) ilişkileri kurulabilir.

  • Sonuncu ilişki üzerinden, kalıtım mekanizması oluşturulabilir.


  • Login