Nesne tabanlı programlama (NTP) özellikleri
Çokbiçimlilik - polimorphizm
Miras – inheritance
Soyutlama – abstraction
Kapsülleme – encapsulation
Dr. Öğr. Üyesi Emre Bendeş
Miras – inheritance
Bir sınıfın miras aldığı sınıfın özelliklerini ve metotlarını üzerinde toplaması
Var olan veri türlerini kullanarak yeni bir veri türü üretmek
Dr. Öğr. Üyesi Emre Bendeş
Miras – inheritance
• Ana sınıf – alt sınıf (base - child)
• Sınıflar arası is-a (generalization) ilişkisi kurar
• Sınıfların özelliklerini alt sınıflara bırakması
• Temel özellikler ana sınıfta toplanır
• Alt sınıflar temel özelliklere kendi özelliklerini eklerler
• Daha iyi organize edilmiş kod sağlar.
• Hiyerarşik tasarım sağlar
• Soyutlamanın önünü açar.
Dr. Öğr. Üyesi Emre Bendeş
public abstract class Hayvan {
int kilo;
public Hayvan(){}
void yemYe() {
kilo++; public class Hamsi extends Balik {
} int kilo;
abstract void hareketEt(); void yemYe() {
} kilo++;
}
void hareketEt() {
public class Balik extends Hayvan{ [Link]("kuyruk sallıyor .....");
public Balik() { kilo -=1;
süper(); }
yüz(); public Hamsi() {
} süper();
void hareketEt() { yüz();
[Link]("kuyruk sallıyor ....."); }
kilo -=1;
void yüz() {
}
[Link]("balık
[Link]("hamsi yüzüyor.");
void yüz() {
super.yüz();
[Link]("balık yüzüyor .....");
}
}
}
}
public class Hamsi extends Balik {
public Hamsi() {
yüz(); Hamsi ciciHamsi = new Hamsi();
}
void yüz() {
[Link]("hamsi yüzüyor."); Override
super.yüz();
}
}
Dr. Öğr. Üyesi Emre Bendeş
Neden Miras Kullanalım
• Doğru kod organizasyonu: Ana Sınıf
Tekrar eden
A sınıfı kod
B sınıfı
A Sınıfı B Sınıfı
• Nesneler hiyerarşisi oluşturma
• Çok biçimlilik Önünü Açar
• Downsampling
Dr. Öğr. Üyesi Emre Bendeş
Miras Çeşitleri
Görüntü kaynağı: [Link]
Dr. Öğr. Üyesi Emre Bendeş
Kapsülleme – encapsulation
Sınıf iç yapısını korumak
Dr. Öğr. Üyesi Emre Bendeş
Kapsülleme – encapsulation
• Sınıfın iç yapısına müdahaleyi düzenler
• Sınıfı tasarımı açısından düşünülmeli
• Erişim belirleyiciler (modifiers)
• Public
• Private
• Protected
• Default
• Getter ve Setter metodları
• Sınıf özelliklerine erişimin kontrollü olmasını sağlar
Dr. Öğr. Üyesi Emre Bendeş
Kapsülleme – encapsulation
Sınıfların amacı iyi
tespit edilmeli
Bu özellikler ile
Bir sınıf hangi
hangi
özellikleri
fonksiyonları
barındırmalı ?
yerine getirmeli ?
Her sınıfın bir amacı olmalı
Amaç ile ilgili bütün işlemler bu sınıfta gerçekleştirilmeli
İstense dahi işlemleri yapan metotlar dışarıdan erişime kapalı olmalı
Dr. Öğr. Üyesi Emre Bendeş
Kapsülleme – encapsulation
Sınıfların amacı iyi
tespit edilmeli
Bu özellikler ile
Bir sınıf hangi
hangi
özellikleri
fonksiyonları
barındırmalı ?
yerine getirmeli ?
A sınıfı B sınıfı A sınıfı B sınıfı
Dr. Öğr. Üyesi Emre Bendeş
Kod karmaşıklığı ortadan
kaldırılmış olur (spagetti kod)
Kapsülleme Modülariteye katkısı olur
ne sağlar ?
Doğru tasarım sağlar
Dr. Öğr. Üyesi Emre Bendeş
Soyutlama – abstraction
Nasıl çalıştığınla ilgilenmiyorum, bana sonuç ver
Dr. Öğr. Üyesi Emre Bendeş
Soyutlama – abstraction
Tanım:
• Soyutlama, yalnızca ilgili ayrıntıları belirleme ve gerekli olmayan ayrıntıları göz ardı etme sürecidir.
• Farklı kod parçalarının kompleks kısımlarını, sahip oldukları ortak davranışlar, amaçlar, karakteristik
özellikler arkasında saklamak sayesinde daha anlaşılır ve kolay kullanılabilir kod yazmaktır.
Ana amaç
• Karmaşıklığı ele almak
• Gereksiz detayları kullanıcıdan gizlemek
• Bağımlılıkları azaltmak
Sonuç:
• Kullanıcı alt planda yatan detayları bilmeden farklı problemlere odaklanabilir.
Dr. Öğr. Üyesi Emre Bendeş
Bir kahve makinasını nasıl çalıştığı ile ilgilenilmez, sadece
kullanılır.
Gerçek Araç kullanırken motorun hangi fizik kanunları ile çalıştığını
hayattan bilmek gerekmez
soyutlama Bir bankaya kredi kartı için başvurulduğunda arka planda geçen
brokrasiyi bilmek gerekmez.
örnekleri “Türkler” kelimesi bir soyutlamadır.
Tek tek insanlar sayılmıyor ortak ve kültürel özellikler ile
gruplandırılarak tek kelime ile milyonlarca insan ifade ediliyor.
Dr. Öğr. Üyesi Emre Bendeş
Sınıf kullanımı açısından düşünülmeli
NTP açısından soyutlama
• Sınıfın iç yapısını bilmeye gerek yok
Soyutlama • Kullanılabilir metodları bilmek yeterli
– Farklı seviyelerde soyutlama
• Sistem
abstraction • Komponent
• Sınıf
Kapsüllemeden farkı
• Kapsüllemenin amacı müdahaleyi düzenlemek
• Soyutlamanın amacı işlem detayını saklamak
Dr. Öğr. Üyesi Emre Bendeş
Soyutlama çeşitleri
1. Veri soyutlama
• Sınıf verileri ve işlenmesinin dış dünyaya kapalı olması
2. Süreç soyutlama
• Süreçlerin nasıl gerçekleştiğine dair detaylar bilinmez
• Sadece gerekli metotlar kullanılabilir
Sınıfı tasarlarken oluşturulan kapsülleme dış
dünyada soyutlama oluşturur
Görsel Kaynağı: [Link]
Dr. Öğr. Üyesi Emre Bendeş
public interface Car {
void turnOnCar();
Java’da Soyutlama
void turnOffCar();
String getCarType();
}
public class AutomaticCar implements Car {
• Interface private String carType = "Automatic";
• Abstract sınıflar
public void turnOnCar() {
[Link]("turn on the automatic car");
}
public void turnOffCar() {
[Link]("turn off the automatic car");
}
public String getCarType() {
return [Link];
public class CarTest { }
}
public static void main(String[] args) {
Car car1 = new ManualCar();
Car car2 = new AutomaticCar(); public class ManualCar implements Car {
[Link](); private String carType = "Manual";
[Link]();
[Link]([Link]()); public void turnOnCar() {
[Link]("turn on the manual car");
[Link](); }
[Link]();
public void turnOffCar() {
[Link]([Link]()); [Link]("turn off the manual car");
}
}
public String getCarType() {
return [Link];
}
} Dr. Öğr. Üyesi Emre Bendeş
public class CoffeeApp {
public static void main(String[] args) {
Soyutlama – abstraction // create a Map of available coffee beans
Map<CoffeeSelection, CoffeeBean> beans
= new HashMap<CoffeeSelection, CoffeeBean>();
• Her sınıf kendi soyutlamasını gerçekleştirir [Link]([Link],
new CoffeeBean("My favorite espresso bean", 1000));
[Link](CoffeeSelection.FILTER_COFFEE,
• Geliştiricisinin bilmesi yeterli new CoffeeBean("My favorite filter coffee bean", 1000));
// get a new CoffeeMachine object
CoffeeMachine machine = new CoffeeMachine(beans);
// brew a fresh coffee
Coffee espresso = [Link]([Link]);
}
}
Kaynak:[Link]
Dr. Öğr. Üyesi Emre Bendeş
Çok Biçimlilik – polymorphism
Aynı işlevin farklı nesnelerle yerine getirilmesi
Dr. Öğr. Üyesi Emre Bendeş
Çokbiçimlilik - polymorphism
Object x = null;
x = new Double(3.14);
[Link]();
x = new Date( );
[Link]();
Object x = new Something( );
[Link]( x );
println(x), [Link]() metodunu çağırır.
Object a = .?.; Çok biçimlilik için esas olan nesne tipini
[Link]( );
[Link]( );
bilmeden fonksiyonu çağırabilmektir.
Çalışır
Hata
verir
Dr. Öğr. Üyesi Emre Bendeş
Çokbiçimlilik - polymorphism
Çalışması için derleyicinin her zaman a nesnesinin run() metodunu
sağlayacağını bilmesi gerekir.
[Link]( );
Çağırdığımız farklı nesnelerin aynı metotlarının olduğunu garanti
etmeliyiz.
Dr. Öğr. Üyesi Emre Bendeş
Çokbiçimlilik - polymorphism
Java için metot varlığını garanti etmenin 2 yöntemi var:
1. Miras
Ana sınıfta ilgili metot bulundurulur.
Alt sınıflarda bu metodun varlığı garanti olur
2. interface
Yapısı gereği interface yi uygulayan sınıflar interface nin belirttiği metotları
gerçekleştirmek zorundadır.
Dr. Öğr. Üyesi Emre Bendeş
Bir örnek : println metodu
[Link]([Link](new Author(1, "Jon", "Johnson"), books));
• Her sınıf için println fonksiyonu yazılmıyor.
• println fonksiyonu her nesne için çalışıyor. (Gönderilen nesnenin sınıfını bilmeden )
Dr. Öğr. Üyesi Emre Bendeş
Çokbiçimlilik - polymorphism
• İleri uyumluluk (forward compatibility)
• Geçmişte yazılan kodları gelecekte yazılacak kodları desteklemesi
• Yeni kodlar eklenmesi gerektiğinde eski kodların değişmek zorunda kalmaması sağlar.
• Bir görevin yapılmasının farklı yolları olabilir
• Bu farklılıklar çevresel etkenler sebebiyle ya da problemin doğasından
kaynaklanabilir
• Aynı sınıf ya da metodun farklı biçimlerde çalışabilmesini sağlar.
• Farklı seviyelerde çok biçimlilik oluşabilir
• Miras
• Soyutlama
• Consructor overriding
• Metod overriding-Statik bağlama (Static binding)
• Aşırı yükleme (Overloading)-Dinamik bağlama (Dynamic binding)
Dr. Öğr. Üyesi Emre Bendeş
Çokbiçimlilik - polimorphizm
• Binding (Bağlama) : method çağrısı ile metot gövdesinin
ilişkilendirilmesini ifade eder
Static binding • Derleme zamanı
(early binding) • overload metotların bağlanması statiktir
Dynamic • Çalışma zamanı
binding (late • override metotların bağlanması dinamiktir
binding) • Miras alınan sınıfla kullanılır.
Dr. Öğr. Üyesi Emre Bendeş
public class StaticBinding { class Dynamic {
public void staticbind() { public void dynamicbind() {
[Link]("This is static binding"); [Link]("Original method dynamic bind of type
} Dynamic. ");
public void staticbind(String s) { }
[Link](s); }
} public class DynamicBinding extends Dynamic {
public void dynamicbind() {
public static void main(String[] args) { [Link]("This is Dynamic Binding");
StaticBinding sb = new StaticBinding(); }
[Link](); public static void main(String[] args) {
[Link]("Static binding occurred."); DynamicBinding db = new DynamicBinding();
} [Link]();
} }
}
Derleyici hangi metot un çağrıldığını
derlerken belirleyebiliyor. hangi metodun çağrıldığı çalışma
zamanı belirleyebiliyor.
Dr. Öğr. Üyesi Emre Bendeş
Çokbiçimlilik (polimorphizm) Çeşitleri
• Ad hoc polymorphism
• Parametric polymorphism
• Subtyping (inclusion)
• Operator
Dr. Öğr. Üyesi Emre Bendeş
Ad hoc polymorphism
• Aynı metodu farklı uygulamalar ve farklı argümanlarla
tanımlamak için kullanılan bir tekniktir.
• Aşırı yükleme kullanılır (static binding)
public class AdHocPolymorphismExample {
void sorting(int[] list) {
[Link](list);
[Link]("sıralamadan sonra tamsayılar: " + [Link](list) );
}
void sorting(String[] names) {
[Link](names);
[Link]("sıralamadan sonra isimler: " + [Link](names) );
}
public static void main(String[] args) {
AdHocPolymorphismExample obj = new AdHocPolymorphismExample();
int list[] = {2, 3, 1, 5, 4};
[Link](list);// Calling with integer array
String[] names = {"ahmet", "veysel", "filiz", "gökhan"};
[Link](names);// Calling with String array
}
} Dr. Öğr. Üyesi Emre Bendeş
Parametric polymorphism.
• Generik sınıflarla gerçekleştirilen çokbiçimlilik
Collection<Hayvan> hayvanlar = new ArrayList<Hayvan>();
Collection<Balik> baliklar = new ArrayList<Balik>();
Dr. Öğr. Üyesi Emre Bendeş
abstract class Animal {
abstract String talk();
}
Subtyping (inclusion ) class Cat extends Animal {
String talk() {
return "Miyaww!";
• Dinamik bağlama kullanılır }
}
• Override metotlar sayesinde farklı
class Dog extends Animal {
nesneler parametre olarak alınabilir. String talk() {
return "Havvv!";
}
}
class Demo {
static void letsHear(final Animal a) {
println([Link]());
}
static void main(String[] args) {
letsHear(new Cat());
letsHear(new Dog());
}
} Dr. Öğr. Üyesi Emre Bendeş
Operator overloading
#include<iostream>
using namespace std;
class Complex {
private:
int real, imag;
public:
Complex(int r = 0, int i =0) {real = r; imag = i;}
// This is automatically called when '+' is used with
// between two Complex objects
Complex operator + (Complex const &obj) {
Complex res;
[Link] = real + [Link];
[Link] = imag + [Link];
return res;
}
void print() { cout << real << " + i" << imag << endl; }
};
int main()
{
Complex c1(10, 5), c2(2, 4);
Complex c3 = c1 + c2; // An example call to "operator+"
[Link]();
}
Dr. Öğr. Üyesi Emre Bendeş
Neden Çok Biçimlilik Kullanılmalı
• Modülariteyi artırır
• Kod uyumu
• Kod esnekliği
• Standartta bağlı çeşitlilik
Dr. Öğr. Üyesi Emre Bendeş