Kalıtım
Bir araba ve bir otobüs düşünün. Bunlar iki farklı araç. Ama yine de, direksiyon, fren, vites, motor vb.Gibi bazı ortak özellikleri paylaşıyorlar.
Bu yüzden miras konseptiyle, bu aşağıdaki gibi temsil edilebilir ...
public class Vehicle {
private Driver driver;
private Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) languages, square brackets are used to denote arrays(Collections).
//You can define as many properties as you want here ...
}
Şimdi bir bisiklet ...
public class Bicycle extends Vehicle {
//You define properties which are unique to bicycles here ...
private Pedal pedal;
}
Ve bir Araba ...
public class Car extends Vehicle {
private Engine engine;
private Door[] doors;
}
Hepsi miras . Nesneleri yukarıda gördüğümüz gibi daha basit Temel formlara ve çocuklarına sınıflandırmak için kullanırız.
Soyut Sınıflar
Soyut sınıflar eksik nesnelerdir. Daha fazla anlamak için, araç benzetmesini bir kez daha düşünelim.
Bir araç sürülebilir. Sağ? Ancak farklı araçlar farklı şekillerde sürülür ... Örneğin, bir Bisiklet sürerken araba kullanamazsınız.
Peki bir aracın sürüş fonksiyonunu nasıl temsil edebilirim? Ne tür bir araç olduğunu kontrol etmek ve kendi işlevi ile sürmek daha zordur; yeni bir araç türü eklerken Driver sınıfını tekrar tekrar değiştirmeniz gerekecektir.
İşte soyut sınıfların ve yöntemlerin rolü geliyor. Sürüş yöntemini, miras alan her çocuğun bu işlevi uygulaması gerektiğini söylemek için soyut olarak tanımlayabilirsiniz.
Araç sınıfını değiştirirseniz ...
//......Code of Vehicle Class
abstract public void drive();
//.....Code continues
Bisiklet ve Araba da nasıl kullanılacağını belirtmelidir. Aksi takdirde, kod derlenmez ve bir hata atılır.
Kısacası, soyut bir sınıf, miras kalan çocukların kendilerinin belirtmesi gereken bazı eksik işlevlere sahip kısmen tamamlanmamış bir sınıftır.
Arayüzler
Arayüzler tamamen eksiktir. Herhangi bir özelliği yoktur. Sadece miras kalan çocukların bir şeyler yapabildiklerini gösteriyorlar ...
Diyelim ki yanınızda farklı türde cep telefonları var. Her birinin farklı işlevler yapmak için farklı yolları vardır; Örn: bir kişiyi arayın. Telefonun üreticisi, nasıl yapılacağını belirler. Burada cep telefonları bir numara çevirebilir - yani, çevrilebilir. Bunu bir arayüz olarak gösterelim.
public interface Dialable {
public void dial(Number n);
}
Burada, Dialable'ın bir numarası nasıl aranacağını tanımlar. Sadece çevirmek için bir numara vermeniz gerekiyor.
// Makers define how exactly dialable work inside.
Dialable PHONE1 = new Dialable() {
public void dial(Number n) {
//Do the phone1's own way to dial a number
}
}
Dialable PHONE2 = new Dialable() {
public void dial(Number n) {
//Do the phone2's own way to dial a number
}
}
//Suppose there is a function written by someone else, which expects a Dialable
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE1;
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
Bu vesileyle, soyut sınıflar yerine arayüzler kullanarak, bir Dialable kullanan fonksiyonun yazarının özellikleri hakkında endişelenmesine gerek yoktur. Örn: Dokunmatik ekran veya tuş takımı var mı, Sabit bir sabit telefon mu yoksa cep telefonu mu? Sadece diyalog olup olmadığını bilmeniz gerekir; Dialable arabirimini devralır (veya uygular).
Ve daha da önemlisi , bir gün Dialable'ı farklı biriyle değiştirirseniz
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE2; // <-- changed from PHONE1 to PHONE2
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
Kodun hala mükemmel şekilde çalıştığından emin olabilirsiniz çünkü dialable'ı kullanan işlev, Dialable arabiriminde belirtilenlerin dışındaki ayrıntılara bağlı değildir (ve olamaz). Her ikisi de bir Dialable arabirimi uygular ve işlevin önem verdiği tek şey budur.
Arayüzler, ortak bir işlevi paylaştıkları sürece (tıpkı bir numarayı çevirmeniz gerektiği sürece, sabit hatlara veya cep telefonlarına geçebildiğiniz gibi) nesneler arasında birlikte çalışabilirlik (birbirinin yerine kullanılabilir) sağlamak için geliştiriciler tarafından yaygın olarak kullanılır. Kısacası, arayüzler herhangi bir özellik olmadan soyut sınıfların çok daha basit bir versiyonudur.
Ayrıca, istediğiniz kadar arabirim uygulayabileceğinizi (devralabileceğiniz) ancak yalnızca tek bir üst sınıfı genişletebileceğiniz (devralabileceğiniz) unutmayın.
Daha Fazla Bilgi
Soyut sınıflar ve Arayüzler