Encapsulation ve Inheritance Örneği?

SiberWorm

Doçent
Katılım
3 Aralık 2009
Mesajlar
508
Reaksiyon puanı
5
Puanları
0
Kapsülleme (Encapsulation)
Kalıtım (Inheritance)

Güzel bir örnekle kim açıklayabilir acaba ?

Yarın sınavım var bunlardanda %100 soru çıkacak..!

Şimdiden teşekkürler.
 

mperk

Profesör
Katılım
25 Nisan 2010
Mesajlar
1,941
Reaksiyon puanı
55
Puanları
0
google amca'yada bi sorsaydın !
 

t(>_<t)

Öğrenci
Katılım
3 Ekim 2009
Mesajlar
44
Reaksiyon puanı
3
Puanları
0
Selam; Inheritance ile başlayım.(Java ile örneklendirecem)
Şimdi bir hayvan objenin olduğunu düşün, bu hayvan objesinin belli başlı değişkenleri ve methodları olsun.
Değişkenler : int gr, int hiz olsun
Methodlar : dur(), kac(), beslen() olsun.
public class Hayvan
{
public int gr,hiz;
public Hayvan() {}
public void dur() {}
public void kac() {}
public void beslen(){}
}
Şimdi birde Kus diye bir objen olsun. Bu kus nedir? hayvandır değil mi? O zaman Hayvan classini Kus classinda inherit edebiliriz (Baska bir deyisle, Kus classini Hayvan classina extend edebiliriz)
Bir classi baska bir classa extend etmek:
Misal A'yi B ye extend edersek, A'nin B'deki butun degiskenleri ve methodlari kendininmis gibi tanimasidir.
Bu durumda bizim kus classimiz şu şekilde olabilir :
public class Kus extends Hayvan
{
public Kus() { }
}

Simdi ne oldu?
Biz Kusta dur(),kac(),beslen(), kg, hiz vb.. seyleri tanimlamadik ama, programimizi yazarken;
Kus.kg, Kus.hiz, Kus.dur(), Kus.kac(), Kus.beslen() şeklinde bu degiskenlere ve methodlara ulaşabiliriz.
Mesela birde Balik adinda bir classimiz olsun buda Hayvani extend etsin.
public class Balik extends Hayvan
{
public Balik() { }
}
Simdi Balikla kusun en temel benzerlikleri nedir? ikiside beslenir, ikiside durur, ikiside kacar.
Hayvan classimiz bize bu methodlari sagliyor, bizde Olusturdugumuz classlari Hayvana extend ediyoruz :)
Peki farklar yok mu? Elbette var. Misal Kus uçar, Balik yuzer. O zaman ne yapiyoruz?
Her classin kendine ait methodunu yaziyoruz.
public class Kus extends Hayvan
{
public Kus() { }
public void uc() { }
}
public class Balik extends Hayvan
{
public Balik() { }
public void yuz() { }
}
Bu yazdigimiz methodlar classlara ozeldir. Yani Balik.uc() yada Kus.yuz() seklinde kullanamayiz.
Bununla birlikte, Hayvan classinda, Diger classlarda kullandigimiz ortak methodlarda degisiklik olabilir.
Misal Hayvan classimiz şöyle olsun :
public class Hayvan
{
public int gr,hiz;
public Hayvan()
{
hiz = 0; gr = 1000;
}
public void dur() { hiz = 0;}
public void kac() {hiz += 1;}
public void beslen(){gr += 100;}
}
Kus ve Balika baktigimizda davranis bicimi ortak olabilecek durum ne olabilir?
Durmak. Durmak temelde hizinin 0 a inmesidir degil mi? O zaman bu methodu Kus ve Balik classlarinda ayri ayri degistirmeye gerek yok.
Ama balikla kusun hizi ayni olmayabilir, beslendiklerinde aldiklari kiloda ayni olmaya bilir. Bunlari degistirebiliriz mesela.
public class Kus extends Hayvan
{
public Kus() { }
public void uc() { }
public void kac() { hiz+= 10; }
public void beslen() { gr+=250; }
}
public class Balik extends Hayvan
{
public Balik() { }
public void yuz() { }
public void kac() { hiz+= 5; }
public void beslen() { gr += 10; }
}
Hayvan classinda tanimli olan methodlarin, Hayvan classini extend eden baska classlarin icinden yeniden tanimlanmasi olayinada Override deniyor.
Encapsulation denen sey ise (bildigim kadariyla) bir objede bulunan degiskenlerin ve methodlarin obje classi içine yazilip, dışardan bunlara direk erişimi engellemektir.

Obje kendi methodlarina & degiskenlerine erisirken kendi kendini cagirmaya ihtiyac duymaz:
Misal Hayvan,Balik,Kus classlarinin icinde hiz+=5, gr +=250 gibi class degiskenlerine direk erisim saglarken;
Atiyorum bir test classindan Bu Degiskenlere Erisim saglamak istedigimizde
Kus k = new Kus();
k.hiz = 10,
k.beslen();
şeklinde erişiriz. Yani objeyi çağririz.

Encapsulation konusunda tam emin değilim gerçi :)
 

SiberWorm

Doçent
Katılım
3 Aralık 2009
Mesajlar
508
Reaksiyon puanı
5
Puanları
0
Selam; Inheritance ile başlayım.(Java ile örneklendirecem)
Şimdi bir hayvan objenin olduğunu düşün, bu hayvan objesinin belli başlı değişkenleri ve methodları olsun.
Değişkenler : int gr, int hiz olsun
Methodlar : dur(), kac(), beslen() olsun.
public class Hayvan
{
public int gr,hiz;
public Hayvan() {}
public void dur() {}
public void kac() {}
public void beslen(){}
}
Şimdi birde Kus diye bir objen olsun. Bu kus nedir? hayvandır değil mi? O zaman Hayvan classini Kus classinda inherit edebiliriz (Baska bir deyisle, Kus classini Hayvan classina extend edebiliriz)
Bir classi baska bir classa extend etmek:
Misal A'yi B ye extend edersek, A'nin B'deki butun degiskenleri ve methodlari kendininmis gibi tanimasidir.
Bu durumda bizim kus classimiz şu şekilde olabilir :
public class Kus extends Hayvan
{
public Kus() { }
}

Simdi ne oldu?
Biz Kusta dur(),kac(),beslen(), kg, hiz vb.. seyleri tanimlamadik ama, programimizi yazarken;
Kus.kg, Kus.hiz, Kus.dur(), Kus.kac(), Kus.beslen() şeklinde bu degiskenlere ve methodlara ulaşabiliriz.
Mesela birde Balik adinda bir classimiz olsun buda Hayvani extend etsin.
public class Balik extends Hayvan
{
public Balik() { }
}
Simdi Balikla kusun en temel benzerlikleri nedir? ikiside beslenir, ikiside durur, ikiside kacar.
Hayvan classimiz bize bu methodlari sagliyor, bizde Olusturdugumuz classlari Hayvana extend ediyoruz :)
Peki farklar yok mu? Elbette var. Misal Kus uçar, Balik yuzer. O zaman ne yapiyoruz?
Her classin kendine ait methodunu yaziyoruz.
public class Kus extends Hayvan
{
public Kus() { }
public void uc() { }
}
public class Balik extends Hayvan
{
public Balik() { }
public void yuz() { }
}
Bu yazdigimiz methodlar classlara ozeldir. Yani Balik.uc() yada Kus.yuz() seklinde kullanamayiz.
Bununla birlikte, Hayvan classinda, Diger classlarda kullandigimiz ortak methodlarda degisiklik olabilir.
Misal Hayvan classimiz şöyle olsun :
public class Hayvan
{
public int gr,hiz;
public Hayvan()
{
hiz = 0; gr = 1000;
}
public void dur() { hiz = 0;}
public void kac() {hiz += 1;}
public void beslen(){gr += 100;}
}
Kus ve Balika baktigimizda davranis bicimi ortak olabilecek durum ne olabilir?
Durmak. Durmak temelde hizinin 0 a inmesidir degil mi? O zaman bu methodu Kus ve Balik classlarinda ayri ayri degistirmeye gerek yok.
Ama balikla kusun hizi ayni olmayabilir, beslendiklerinde aldiklari kiloda ayni olmaya bilir. Bunlari degistirebiliriz mesela.
public class Kus extends Hayvan
{
public Kus() { }
public void uc() { }
public void kac() { hiz+= 10; }
public void beslen() { gr+=250; }
}
public class Balik extends Hayvan
{
public Balik() { }
public void yuz() { }
public void kac() { hiz+= 5; }
public void beslen() { gr += 10; }
}
Hayvan classinda tanimli olan methodlarin, Hayvan classini extend eden baska classlarin icinden yeniden tanimlanmasi olayinada Override deniyor.
Encapsulation denen sey ise (bildigim kadariyla) bir objede bulunan degiskenlerin ve methodlarin obje classi içine yazilip, dışardan bunlara direk erişimi engellemektir.

Obje kendi methodlarina & degiskenlerine erisirken kendi kendini cagirmaya ihtiyac duymaz:
Misal Hayvan,Balik,Kus classlarinin icinde hiz+=5, gr +=250 gibi class degiskenlerine direk erisim saglarken;
Atiyorum bir test classindan Bu Degiskenlere Erisim saglamak istedigimizde
Kus k = new Kus();
k.hiz = 10,
k.beslen();
şeklinde erişiriz. Yani objeyi çağririz.

Encapsulation konusunda tam emin değilim gerçi :)


Hocam sağolasın.Sınavda haftaya ertelendi işime yarayacak çok sağol
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
encapsulation'a da ben birşeyler yazayım : Öncelikle faydaları sonra da örneği ile geçicem.

class ların field'larının sadece yazma ya da sadece okuma gibi sınırlandırmaları yapılır.
class içinde saklanan herşeye full kontrol sağlar.
class'ı kullanan diğer class'lar bu class içindeki değişiklikleri bilmek zorunda kalmazlar. sürekliliği sağlar yani. class'da değişiklik olsa bile onu kullanan class'ın bir değişikliğe ihtiyacı olmaz.

örnekler ve anlatım bir siteden alıntıdır :
-----------------------------------

public class EncapTest{

private String name;
private String idNum;
private int age;

public int getAge(){
return age;
}

public String getName(){
return name;
}

public String getIdNum(){
return idNum;
}

public void setAge( int newAge){
age = newAge;
}

public void setName(String newName){
name = newName;
}

public void setIdNum( String newId){
idNum = newId;
}
}


bu class'ı kullanmak isteyen bir class direk onun elemanlarına erişemez. bunun yerine onun metodlarını yani termineloji ile getter ve setter'lerini kullanmak zorunda.

public class RunEncap{

public static void main(String args[]){
EncapTest encap = new EncapTest();
encap.setName("James");
encap.setAge(20);
encap.setIdNum("12343ms");

System.out.print("Name : " + encap.getName()+
" Age : "+ encap.getAge());
}
}
 

SiberWorm

Doçent
Katılım
3 Aralık 2009
Mesajlar
508
Reaksiyon puanı
5
Puanları
0
@annttiigs eyw.hocam teşekkürler.Çok Sağol
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
rica ;) sorunuz olursa ben bakıyorum foruma. Java konusunda yardımcı olmaya çalışırım ;)
 

keyloger

Rektör
Katılım
4 Ocak 2008
Mesajlar
13,268
Reaksiyon puanı
236
Puanları
243
Bir de polymorphysim anlatsanız 10 numara olacak. :P
 

SiberWorm

Doçent
Katılım
3 Aralık 2009
Mesajlar
508
Reaksiyon puanı
5
Puanları
0
Hmm valla ikisinide ilk defa duydum :D
 

SiberWorm

Doçent
Katılım
3 Aralık 2009
Mesajlar
508
Reaksiyon puanı
5
Puanları
0
@keyloger anladım hocam.Ama onu atladı hoca :) Neyse sağlık olsun inşallah Allah izin verirse üniversitede görürüz :)
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
polymorphisim : çok türevlilik anlamına gelir. objelerin subclass'ın super class gibi çağırılabildiği bir yapı oluşturulduğunu düşünün. "is a" "has a" terminelojisinde "is a"'ye karşılık düştüğü söylenebilir. konuyla ilgili olarak yarın örnek de veririm :)
 
Üst