NEDEN ARAYÜZ ??????
Bir köpekle başlar. Özellikle, bir boksör .
Pugın çeşitli davranışları vardır:
public class Pug {
private String name;
public Pug(String n) { name = n; }
public String getName() { return name; }
public String bark() { return "Arf!"; }
public boolean hasCurlyTail() { return true; } }
Ve ayrıca bir takım davranışları olan bir Labrador'unuz var.
public class Lab {
private String name;
public Lab(String n) { name = n; }
public String getName() { return name; }
public String bark() { return "Woof!"; }
public boolean hasCurlyTail() { return false; } }
Bazı puglar ve laboratuarlar yapabiliriz:
Pug pug = new Pug("Spot");
Lab lab = new Lab("Fido");
Ve onların davranışlarını çağırabiliriz:
pug.bark() -> "Arf!"
lab.bark() -> "Woof!"
pug.hasCurlyTail() -> true
lab.hasCurlyTail() -> false
pug.getName() -> "Spot"
Diyelim ki bir köpek kulübesi işletiyorum ve barındırdığım tüm köpekleri takip etmem gerekiyor. Ben ayrı dizide benim pugs ve Labrador saklamak gerekir :
public class Kennel {
Pug[] pugs = new Pug[10];
Lab[] labs = new Lab[10];
public void addPug(Pug p) { ... }
public void addLab(Lab l) { ... }
public void printDogs() { // Display names of all the dogs } }
Ancak bu açıkça optimal değildir. Eğer bazı kaniş ev istiyorum de, bunu Poodle bir dizi eklemek için benim Kennel tanımını değiştirmek zorunda. Aslında, her köpek türü için ayrı bir diziye ihtiyacım var.
İçgörü: Hem puglar hem de labradors (ve kanişler) köpek türleridir ve aynı davranışlara sahiptirler. Yani, (bu örneğin amaçları için) tüm köpeklerin havlayabileceğini, bir isme sahip olabileceğini ve kıvırcık bir kuyruğa sahip olabileceğini veya olmayabilir. Tüm köpeklerin neler yapabileceğini tanımlamak için bir arayüz kullanabiliriz, ancak bu belirli davranışları uygulamak için belirli köpek türlerine bırakabiliriz. Arayüz "tüm köpeklerin yapabileceği şeyler" diyor, ancak her davranışın nasıl yapıldığını söylemiyor.
public interface Dog
{
public String bark();
public String getName();
public boolean hasCurlyTail(); }
Sonra Köpek davranışlarını uygulamak için Pug ve Lab sınıflarını biraz değiştiriyorum. Bir Pug'ın bir Köpek ve bir Lab'ın bir köpek olduğunu söyleyebiliriz.
public class Pug implements Dog {
// the rest is the same as before }
public class Lab implements Dog {
// the rest is the same as before
}
Daha önce yaptığım gibi hala Pugs ve Labs'ı başlatabilirim, ancak şimdi de bunu yapmanın yeni bir yolunu elde ediyorum:
Dog d1 = new Pug("Spot");
Dog d2 = new Lab("Fido");
Bu d1'in sadece bir köpek olmadığını, özellikle bir Pug olduğunu söylüyor. Ve d2 aynı zamanda bir Köpek, özellikle de bir Lab. Davranışları çağırabiliriz ve daha önce olduğu gibi çalışırlar:
d1.bark() -> "Arf!"
d2.bark() -> "Woof!"
d1.hasCurlyTail() -> true
d2.hasCurlyTail() -> false
d1.getName() -> "Spot"
İşte tüm ekstra işlerin işe yaradığı yer. Kennel sınıfı çok daha basit hale geldi. Sadece bir dizi ve bir addDog yöntemine ihtiyacım var. Her ikisi de köpek olan herhangi bir nesne ile çalışacaktır; yani, Köpek arayüzünü uygulayan nesneler.
public class Kennel {
Dog[] dogs = new Dog[20];
public void addDog(Dog d) { ... }
public void printDogs() {
// Display names of all the dogs } }
Bunu nasıl kullanacağınız aşağıda açıklanmıştır:
Kennel k = new Kennel();
Dog d1 = new Pug("Spot");
Dog d2 = new Lab("Fido");
k.addDog(d1);
k.addDog(d2);
k.printDogs();
Son ifade şunu gösterir: Spot Fido
Bir arabirim, arabirimi uygulayan tüm sınıfların ortak paylaşacağı bir dizi davranış belirleme olanağı sağlar. Sonuç olarak, ne tür belirli bir nesneyi tutacağını, yalnızca arabirimi uygulayan nesneleri tutacaklarını önceden bilmek zorunda olmayan değişkenleri ve koleksiyonları (diziler gibi) tanımlayabiliriz.