1. Arayüzlerin tanıtılması
Bugün bilgi edinme gününüz. Bir diğer yeni ve ilginç konu ise arayüzler.
Arayüz kavramı, soyutlama ve çok biçimlilik ilkelerinin çocuğudur. Bir arabirim, tüm yöntemlerin soyut olduğu soyut bir sınıfa çok benzer. Bir sınıfla aynı şekilde bildirilir, ancak biz interface
anahtar kelimeyi kullanırız.
interface Feline
{
void purr();
void meow();
void growl();
}
Arayüzler hakkında bazı yararlı gerçekler şunlardır:
1. Arayüz bildirme
interface Drawable
{
void draw();
}
interface HasValue
{
int getValue();
}
- Anahtar kelime yerine
class
yazıyoruzinterface
. - Yalnızca soyut yöntemler içerir (anahtar kelimeyi yazmayın
abstract
) - Aslında, arayüzler tüm
public
yöntemlere sahiptir.
Bir arabirim yalnızca arabirimleri devralabilir. Ancak bir arayüzün birçok ebeveyni olabilir. Bunu söylemenin başka bir yolu, Java'nın birden çok arabirim mirasına sahip olduğunu söylemektir. Örnekler:
interface Piece extends Drawable, HasValue
{
int getX();
int getY();
}
3. Arayüzlerden sınıfları devralma
Bir sınıf, birden çok arabirimi miras alabilir (yalnızca bir sınıftan). Bu, anahtar kelime kullanılarak yapılır implements
. Örnek:
abstract class ChessItem implements Drawable, HasValue
{
private int x, y, value;
public int getValue()
{
return value;
}
public int getX()
{
return x;
}
public int getY()
{
return y;
}
}
ChessItem sınıfı soyut olarak bildirilir: draw
. Başka bir deyişle, ChessItem
sınıf bir soyut yöntem içerir — draw()
.
extends
ve anahtar kelimelerinin teknik anlamı implements
aynıdır: her ikisi de kalıtımdır. Ayrım, kodun okunabilirliğini artırmak için yapılmıştır. extends
Ayrıca sınıfların miras alındığını (via ile ) ve arayüzlerin uygulandığını (via ile implements
) söylüyoruz.
4. Değişkenler
İşte en önemli şey: sıradan değişkenler arabirimlerde bildirilemez (statik olanlar yapsa da).
Peki neden arayüzlere ihtiyacımız var? Ne zaman kullanılırlar? Arayüzlerin sınıflara göre iki güçlü avantajı vardır:
2. "Yöntemlerin açıklamasını" uygulamalarından ayırmak.
Daha önce, sınıfınızın metotlarının diğer sınıflardan çağrılmasına izin vermek istiyorsanız, metotlarınızın anahtar kelime ile işaretlenmesi gerektiğinipublic
söylemiştik . Bu yöntemlerden bazılarının yalnızca kendi sınıfınızdan çağrılmasını istiyorsanız, bunları anahtar kelimeyle işaretlemeniz gerekir private
. Başka bir deyişle, sınıfın yöntemlerini "herkesin kullanması için" ve "yalnızca kendi kullanımımız için" olmak üzere iki kategoriye ayırıyoruz.
Arayüzler bu bölünmeyi daha da güçlendirmeye yardımcı olur. "Herkesin kullanması için özel bir sınıf" ve birinci sınıfı devralacak "yalnızca kendi kullanımımız için" ikinci bir sınıf yapacağız. İşte kabaca nasıl görüneceği:
Önce | Sonrasında |
---|---|
|
|
|
|
Sınıfımızı ikiye ayırdık: bir arayüz ve arayüzü miras alan bir sınıf . Ve buradaki avantaj nedir?
Birçok farklı sınıf, aynı arabirimi uygulayabilir (devralabilir). Ve her birinin kendi davranışı olabilir. Örneğin, ArrayList
LinkedList
arayüzün iki farklı uygulaması vardır List
.
Böylece, sadece çeşitli uygulamaları değil, aynı zamanda uygulayıcı sınıfın kendisini de gizleriz (çünkü kodda sadece arayüze ihtiyacımız var). Bu, çok esnek olmamızı sağlar: program çalışırken, bir nesneyi diğeriyle değiştirebilir, onu kullanan tüm sınıfları etkilemeden bir nesnenin davranışını değiştirebiliriz.
Bu, polimorfizm ile birleştirildiğinde çok güçlü bir tekniktir. Şimdilik, bunu neden yapmanız gerektiği açık olmaktan çok uzak. Arayüzlerin hayatınızı onlarsız olduğundan çok daha kolay hale getirebileceğini anlamak için önce onlarca veya yüzlerce sınıfı olan programlarla karşılaşmanız gerekir.
3. Çoklu kalıtım
Java'da, tüm sınıfların yalnızca bir üst sınıfı olabilir. Diğer programlama dillerinde, sınıflar genellikle birden fazla ebeveyn sınıfına sahip olabilir. Bu çok uygundur, ancak birçok sorunu da beraberinde getirir.
Java'nın yaratıcıları bir uzlaşmaya vardılar: sınıfların çoklu kalıtımını yasakladılar, ancak arayüzlerin çoklu kalıtımına izin verdiler. Bir arayüzün birden fazla ebeveyn arayüzü olabilir. Bir sınıfın birden çok üst arabirimi olabilir, ancak yalnızca bir üst sınıf olabilir.
Neden çoklu sınıf kalıtımını yasakladılar, ancak arayüzlerin çoklu kalıtımına izin verdiler? Sözde elmas kalıtım sorunu nedeniyle:

B sınıfı, A sınıfını miras aldığında, C ve D sınıfları hakkında hiçbir şey bilmez. Böylece A sınıfının değişkenlerini uygun gördüğü şekilde kullanır. C sınıfı da aynısını yapar: A sınıfının değişkenlerini kullanır, ancak farklı bir şekilde. Ve tüm bunlar D sınıfında bir çatışmaya neden olur.
Aşağıdaki basit örneğe bakalım. Diyelim ki 3 sınıfımız var:
class Data
{
protected int value;
}
class XCoordinate extends Data
{
public void setX (int x) { value = x;}
public int getX () { return value;}
}
class YCoordinate extends Data
{
public void setY (int y) { value = y;}
public int getY () { return value; }
}
Data sınıfı, değişkeni depolar value
. XCoordinate alt sınıfı, değeri depolamak için bu değişkeni kullanır x
ve YCoordinate
alt sınıf, değeri depolamak için onu kullanır y
.
Ve çalışıyor. Ayrı ayrı. XCoordinate
Ancak, XYCoordinates sınıfının hem ve hem de sınıfları miras almasını istiyorsak YCoordinate
, bozuk kod elde ederiz. Bu sınıf, ata sınıflarının yöntemlerine sahip olacak, ancak aynı value variable
.
Ancak arabirimlerin değişkenleri olamayacağı için bu tür bir çatışmaya sahip olamazlar. Buna göre, arayüzlerin çoklu kalıtımına izin verilir.
GO TO FULL VERSION