MERHABA! Bugün OOP ilkeleri üzerine bir dizi dersi bitiriyoruz. Bu dersimizde Java polimorfizminden bahsedeceğiz. Polimorfizm, birkaç türle sanki aynı türmüş gibi çalışabilme yeteneğidir. Ayrıca, nesnelerin davranışları türlerine bağlı olarak farklı olacaktır. Gelin bu açıklamaya biraz daha yakından bakalım. İlk bölümle başlayalım: 'birkaç türle sanki aynı türmüş gibi çalışabilme becerisi'. Farklı türler nasıl aynı olabilir? Kulağa biraz tuhaf geliyor :/ Aslında her şey çok basit. Örneğin bu durum, mirasın olağan kullanımı sırasında ortaya çıkar. Bunun nasıl çalıştığını görelim. Tek bir run() yöntemine sahip basit bir Cat ebeveyn sınıfımız olduğunu varsayalım :
Bu "genelleme" istenmediğinde ve bunun yerine her türün farklı davranmasına ihtiyacımız olduğunda, her tür kendi işini yapar. Polimorfizm sayesinde, çok çeşitli sınıflar için tek bir arabirim (yöntemler kümesi) oluşturabilirsiniz. Bu, programları daha az karmaşık hale getirir. Programı 40 tür kediyi destekleyecek şekilde genişletsek bile, yine de en basit arayüze sahip oluruz: 40 kedinin tümü için tek bir
run() yöntemi.
public class Cat {
public void run() {
System.out.println("Run!");
}
}
Şimdi Cat'i miras alan üç sınıf oluşturacağız : Lion , Tiger ve Cheetah .
public class Lion extends Cat {
@Override
public void run() {
System.out.println("Lion runs at 80 km/h");
}
}
public class Tiger extends Cat {
@Override
public void run() {
System.out.println("Tiger runs at 60 km/h");
}
}
public class Cheetah extends Cat {
@Override
public void run() {
System.out.println("Cheetah runs at up to 120 km/h");
}
}
Yani 3 sınıfımız var. Onlarla aynı sınıftaymış gibi çalışabileceğimiz durumu modelleyelim. Kedilerimizden birinin hasta olduğunu ve Dr. Dolittle'ın yardımına ihtiyacı olduğunu hayal edin. Aslanları, kaplanları ve çitaları iyileştirebilen bir Dolittle sınıfı yaratmayı deneyelim .
public class Dolittle {
public void healLion(Lion lion) {
System.out.println("Lion is healthy!");
}
public void healTiger(Tiger tiger) {
System.out.println("Tiger is healthy!");
}
public void healCheetah(Cheetah cheetah) {
System.out.println("Cheetah is healthy!");
}
}
Sorun çözülmüş gibi görünüyor: sınıf yazıldı ve gitmeye hazır. Ancak programımızı genişletmek istersek ne yapacağız? Şu anda sadece 3 tipimiz var: aslanlar, kaplanlar ve çitalar. Ancak dünyada 40'tan fazla kedi türü vardır. Manullar, jaguarlar, Maine Coons, ev kedileri ve diğer her şey için ayrı sınıflar eklersek ne olacağını hayal edin. Programın kendisi elbette çalışacaktır, ancak her tür kediyi iyileştirmek için Dolittle sınıfına sürekli olarak yeni yöntemler eklemek zorundayız . Sonuç olarak, benzeri görülmemiş boyutlara büyüyecek. Polimorfizm - "aynı türmüş gibi birkaç türle çalışma yeteneği" - burada devreye giriyor. Aynı şeyi yapmak için sayısız yöntem yaratmamıza gerek yok - bir kediyi iyileştirmek. Hepsi için tek bir yöntem yeterlidir:
public class Dolittle {
public void healCat(Cat cat) {
System.out.println("The patient is healthy!");
}
}
HealCat () yöntemi Lion , Tiger ve Cheetah nesnelerini kabul edebilir — bunların tümü Cat örneğidir :
public class Main {
public static void main(String[] args) {
Dolittle dolittle = new Dolittle();
Lion simba = new Lion();
Tiger shereKhan = new Tiger();
Cheetah chester = new Cheetah();
dolittle.healCat(simba);
dolittle.healCat(shereKhan);
dolittle.healCat(chester);
}
}
Konsol çıktısı: Hasta sağlıklı! Hasta sağlıklı! Hasta sağlıklı! Yani bizim Dolittle'ımızclass, farklı türlerle sanki aynı türmüş gibi çalışır. Şimdi ikinci kısma geçelim: "Üstelik, nesnelerin davranışları türlerine göre farklı olacaktır". Her şey çok basit. Doğada her kedi farklı bir şekilde koşar. En azından farklı hızlarda çalışırlar. Üç kedimiz arasında çita en hızlısı, kaplan ve aslan ise daha yavaş koşar. Başka bir deyişle, davranışları farklıdır. Polimorfizm, farklı türleri bir olarak kullanmamıza izin vermekten daha fazlasını yapar. Ayrıca, her birine özgü davranışı koruyarak farklılıklarını hatırlamamızı sağlar. Aşağıdaki örnek bunu göstermektedir. Kedilerimizin başarılı bir şekilde iyileştikten sonra biraz koşmaya karar verdiğini varsayalım. Bunu Dolittle sınıfımıza ekleyeceğiz :
public class Dolittle {
public void healCat(Cat cat) {
System.out.println("The patient is healthy!");
cat.run();
}
}
Üç hayvanı tedavi etmek için aynı kodu çalıştırmayı deneyelim:
public static void main(String[] args) {
Dolittle dolittle = new Dolittle();
Lion simba = new Lion();
Tiger shereKhan = new Tiger();
Cheetah chester = new Cheetah();
dolittle.healCat(simba);
dolittle.healCat(shereKhan);
dolittle.healCat(chester);
}
Ve işte sonuçlar şöyle görünüyor: Hasta sağlıklı! Aslan 80 km/s hızla koşar. Hasta sağlıklı! Kaplan 60 km/s hızla koşar. Hasta sağlıklı! Cheetah 120 km/s'e kadar hızla koşar Burada, üç hayvanı da Cat'e "genelleştirdikten" sonra yönteme geçirmemize rağmen, nesnelerin belirli davranışlarının korunduğunu açıkça görüyoruz . Polimorfizm nedeniyle Java, bunların herhangi üç kedi olmadığını çok iyi hatırlıyor. Bunlar, her biri farklı şekilde koşan bir aslan, bir kaplan ve bir çitadır. Bu, polimorfizmin ana avantajını göstermektedir: esneklik. Pek çok tür tarafından paylaşılan bazı işlevleri uygulamamız gerektiğinde, aslanlar, kaplanlar ve çitalar basitçe "kediler" olurlar. Tüm hayvanlar farklıdır, ancak bazı durumlarda kedi, türü ne olursa olsun kedidir :) İşte size videolu doğrulama.
Daha fazla okuma: |
---|
GO TO FULL VERSION