Object Oriented Programming Concept leri olan
Polymorphism
Inheritance
Encapsulation
Abstract Class
Interface
gibi kavramların ne olduğunu ne fayda sağladığını öğrenip iyice anlayın, daha sonra bu faydalardan yararlanırken farkında olmadan OOP e girmiş olacaksınız.
En basit haliyle insanların kişisel bilgisini tutan bir uygulamanız var.İnsanları iş gruplarına göre sınıflandıracağız (Marx'ın sınıflı toplumu değil =) yanlış anlaşılmasın )
Tasarım aşamasında detaya inmek istemiyorsunuz veya büyük projelerde yönetici pozisyonundaki kişiler bu özellikleri belirleyecek programcılar da detayları halledecek bu durumda Interface ler yazılır.
Interface de sadece değişkenler ve fonksiyon prototipleri bulunur. Mesela;
public int Calis();
private int tcno;
Örneğin İnsan Sınıfını yaratacaksınız ama hiç kimse sadece insan özelliğine sahip olmayacak o yüzden insan sınıfını Abstract Class yapacaksınız. Bu Abstract Class ı ilk olarak yazılan Interface e göre yazacaksınız. Bu ne demek oluyor hiç kimse sadece insan olamayacak ama bu insan sınıfı size kendi üzerinden başka sınıflar yaratma olanağı sağlayacak. İnsan->İşçi İnsan->Memur gibi...
Ahanda tam burda Inheritance devreye girecek Insan Abstract Class ından İşçi Sınıfını İşçi Sınıfından Özel Sektör İşçi, Taşeron İşçi gibi diğer alt sınıfları türeteceğiz. Bunun bize hem sistem tasarımı ve bütünlüğü hem de benzer sınıfların tekrar tanımlanması gibi kolaylıklar sağladığından bahsetmeme gerek yok sanırım.
Şimdi başka bir boyuta sıçrayacağız. Özellikle büyük projelerde her şey iç içe geçtiğinde programcıya sadece ihtiyacı olacak olan kısımları (fonksiyon,değişken,veri yapısı, hatta nesne) sunarsınız, diğer kısımları ise yanlış kullanımlara/değişimlere mahal vermemek ve programcı için detayları minimuma indirgemek için saklarsınız aha bu da Encapsulation dır. Az önce bahsettiğimiz İşçinin TC kimlik no su nesne yaratılırken bir defa oluşturulup sonra da değiştirilmemelidir, bunu nasıl yaparım peki
private int TCNO
derim önce ki class ın dışında erişim olmasın
ilk atamayı Constructor fonksiyon içinde yapacağım için
İşçi(int tc,.......)
{
// this nedir araştırırsınız
this.TCNO = tc;
}
derim ilk sefer set eder sonra bir daha dokunmam. Peki bu TCNO dışardan lazım olacak onu nasıl yapacağız derseniz onu da public bir fonksiyonla halledeceğiz.
public int getTcNo(void)
{
return this.TcNo;
}
gibi bir public getter fonksiyon yazarak bu konuyu da çözerim. Böylece tcno kişi ilk oluşturulurken belirlenecek ve de class ımızı kullanan uygulama tarafından yanlışlıkla da olsa değiştirilemeyecek.
Son olarak ise Polymorphism olayına gelelim.
Şimdi ben bu İnsan denen hayvanın Class ını tanımladım, bunun fonksiyonlarının nasıl çalışacağı ise İnsan türüne göre değişecek ve bunu önceden belirleme şansım yok. O zaman İnsan Class ı içinde diye fonksiyonumu tanımlar içini de boş bırakırım.
public int Calis()
daha sonra İşçi Sınıfına geldiğimde bu fonksiyonu yazarken
public int Calis()
{
It gibi çalış
}
Memur Sınıfına geldiğimde
public int Calis()
{
G*t büyüt
}
gibi gibi fonksiyonları yazarım. Bu da olur Polymorphism.
OOP alışınca bağımlılık yapar, ufacık bi veri yapısı için bile class yazarsınız ki aslında yapılması gereken de budur.
Başka bir örnekle özetlersek
Hayvan sınıfının genel özelliklerini bir Interface ile tanımlarım
Hayvan sınıfını Abstract Class olarak yazarım çünkü hiç bir hayvan sadece hayvan olamaz türü vardır.
Bu sınıftan İnheritance ile Abstract Kedigiller ile türettirim.
Daha sonra Abstract Kedigillerden İnheritance ile Kedi yi ve Kaplan ı türetirim.
Kedinin bazı özelliklerini veya fonksiyonlarını read-only yapmak için veya gizlemek için private protected olarak tanımlar böylece Encapsule ederim. Mesela az sonra kullanacağım FareYakala() fonksiyonu kullanıcı tarafından direk çağrılmayacak.
Kedi.Beslen() fonksiyonu kendi içinden Avlan() fonksiyonunu o da FareYakala() fonksiyonunu çağıracak. Bu durumda programcının görmesi gereken tek fonksiyon Beslen() fonksiyonu. Bu durumda bu fonksiyonları
public void Beslen(){.....}
private void Avlan() {.....}
private void FareYakala(){......}
şeklinde tanımlarım.
Son olarak da Kedigillerin içi boş olan Avlan() fonksiyonunu kedi ve kaplan için farklı olacaktır. Kedi için
private void Avlan()
{
FareYakala();
}
Kaplan için
private void Avlan()
{
CeylanYakala();
}
şeklinde tanımlarım, bu da Polymorphism olur.
Atladığım eksik/yanlış belirttiğim bir şey varsa arkadaşlar eklesin bu saatte bu kadar oluyor.