"Merhaba Amigo! Şimdi çokça kullanacağını düşündüğüm bir konu var. Miras hakkında konuşuyorum . "

Acemi olanlar için programlama sihir gibidir. Öyleyse bir benzetmeyle başlayayım…

Diyelim ki uçan bir at yaratmak isteyen bir sihirbazsınız. Bir Pegasus yaratmayı deneyebilirsin. Ancak uçan atlar doğal olarak meydana gelmediği için gerçekten zor zamanlar geçireceksiniz. Yapacak çok işin olurdu. Bir atla başlayıp birkaç kanat çağırmak çok daha kolay olurdu.

Miras.  Kalıtımın avantajları - 1

Programlamada bu sürece "miras" diyoruz . Çok karmaşık bir sınıf yazmanız gerektiğini varsayalım. Sıfırdan kod yazmak için uzun zaman harcayabilir ve ardından hataları bulmak için uzun testler yapabilirsiniz. Ama neden zor yoldan? Etrafa bakıp aradığınız sınıfın zaten var olup olmadığını görmek daha mı iyi?

Diyelim ki ihtiyacınız olan işlevselliğin %80'ini uygulayan bir sınıf buldunuz. Kodunu sınıfınıza kopyalayabilirsiniz. Ancak bunun birkaç dezavantajı olacaktır:

1) Bulduğunuz sınıf zaten bayt kodunda derlenmiş olabilir. Kaynak koduna erişiminiz olmayabilir.

2) Sınıfın kaynak koduna sahip olabilirsiniz, ancak aynı zamanda bir başkasının kodunun 6 satırını bile kullanırsanız birkaç milyarlık dava açabilecek bir şirkette çalışıyor olabilirsiniz. Ve sonra seni dava edecekler.

3) Bu, birçok kodun gereksiz yere kopyalanmasına yol açar. Ve diğer sınıfın yazarı bir hata bulur ve düzeltirse, hata sizde kalır.

Orijinal sınıfın koduna yasal izin almayı gerektirmeyen daha zarif bir çözüm var. Java'da, diğer sınıfı sınıfınızın ebeveyni olarak ilan edebilirsiniz. Bu, o sınıfın kodunu kendi sınıfınıza eklemekle eşdeğerdir. Üst sınıfın tüm verileri ve yöntemleri sınıfınızda görünecektir. Örneğin, bir "at"tan miras alabilir, "kanatlar" ekleyebilir ve bir "Pegasus" alabilirsiniz.

Miras.  Kalıtımın avantajları - 2

"Çok ilginç. Lütfen devam edin."

"Kalıtımın başka kullanımları da var. Çok benzer on sınıfınız olduğunu varsayalım. Eşleşen veri ve yöntemleri var. Özel bir temel sınıf oluşturabilir , verileri (ve ilişkili yöntemleri) temel sınıfa taşıyabilir ve bu on sınıfa sahip olabilirsiniz. başka bir deyişle, her sınıf için, temel sınıf olarak da bilinen bir üst sınıfa sahip olduğunu belirtirsiniz."

"Soyutlamanın avantajlarının yalnızca kapsülleme ile bağlantılı olarak gerçekten ortaya çıkması gibi , kalıtımın avantajları da polimorfizmle büyütülür. Ama bunu size yarın anlatacağım. Bugün kalıtımın birkaç örneğine bakalım."

"Diyelim ki bir satranç programı yazıyoruz. Satranç taşları için derslere ihtiyacımız olacak. Hangi dersleri önerirsin, Amigo?"

"Şah, Vezir, Fil, At, Kale ve Piyon."

"Çok iyi. Hiçbir şey kaçırmadın."

"Peki bu sınıflarda hangi verilerin saklanmasını önerirsiniz?"

"Her taşın tahta konumu (x ve y) ve değeri. Ne de olsa bazı taşlar diğerlerinden daha değerli."

"Ve bu sınıflar arasındaki farklar nelerdir?"

"Taşları nasıl hareket ettirdikleri konusunda farklılık gösteriyorlar. Davranışlarında."

"Evet. Bunları şu şekilde sınıflar olarak tanımlayabilirsiniz:"

class King
{
int x;
int y;
int worth;
void kingMove()
{
//code that defines,
//how the king moves
}
}
class Queen
{
int x;
int y;
int worth;
void queenMove()
{
//code that defines,
//how the queen moves
}
}
class Rook
{
int x;
int y;
int worth;
void rookMove()
{
//code that defines,
//how the rook moves
}
}
class Knight
{
int x;
int y;
int worth;
void knightMove()
{
//code that defines,
//how the knight moves
}
}
class Bishop
{
int x;
int y;
int worth;
void bishopMove()
{
//code that defines,
//how the bishop moves
}
}
class Pawn
{
int x;
int y;
int worth;
void pawnMove()
{
//code that defines,
//how the pawn moves
}
}

"Evet, tam olarak böyle yazardım."

"Ama daha az kod yazmak için kalıtımı nasıl kullanabileceğinize bir bakın. Aynı yöntemleri ve verileri ortak bir sınıfa taşıyabiliriz. Buna ChessItem diyelim . satranç taşı. Ama sınıf son derece yardımcı olacaktır:"

class King extends ChessItem
{
void kingMove()
{
//code that defines,
//how the king moves
}
}
class Queen extends ChessItem
{
void queenMove()
{
//code that defines,
//how the queen moves
}
}
class Rook extends ChessItem
{
void rookMove()
{
//code that defines,
//how the rook moves
}
}
class ChessItem
{
int x;
int y;
int worth;
}
class Knight extends ChessItem
{
void knightMove()
{
//code that defines,
//how the knight moves
}
}
class Bishop extends ChessItem
{
void bishopMove()
{
//code that defines,
//how the bishop moves
}
}
class Pawn extends ChessItem
{
void pawnMove()
{
//code that defines,
//how the pawn moves
}
}

"Ne kadar ilginç!"

"Kesinlikle! Fayda, özellikle binlerce farklı nesne ve yüzlerce sınıf içeren projelerde büyüktür. Bu durumda, uygun şekilde seçilen sınıflar, yalnızca mantığı önemli ölçüde basitleştirmekle kalmaz, aynı zamanda gerekli kodu on kat azaltır."

"Öyleyse bir sınıfı miras almak için ne yapmanız gerekiyor?"

"Bir sınıf tanımladıktan sonra, ' extends ' anahtar kelimesini ve ardından üst sınıfın adını kullanırız . Yalnızca bir sınıftan miras alabilirsiniz. "

Miras.  Kalıtımın avantajları - 3

Resimde bir «domuzdan» miras kalan bir «inek» gösterilmektedir. "Domuz", "tavuktan" ve "tavuk", "yumurtadan" miras alır. Her sınıfın sadece bir ebeveyni vardır! Böyle bir kalıtım her zaman mantıklı değildir. Yalnızca bir domuzunuz varsa ve gerçekten bir ineğe ihtiyacınız varsa, programcılar genellikle "domuzdan" bir "inek" yapma arzusuna karşı koyamazlar.

"Ama ya iki sınıftan miras almak istersem? Yapabileceğim bir şey var mı?!"

"Pek değil. Java sınıfları, uygulamanın çoklu kalıtımını desteklemez: bir sınıf yalnızca tek bir üst sınıfa sahip olabilir. Ancak, birden fazla tür kalıtımı vardır, bu da bir sınıfın birden fazla arabirim uygulayabileceği anlamına gelir. Bu, sorunu biraz hafifletir. "

"Anlıyorum. Arayüz nedir?"

"Sana yarın arayüzlerden bahsedeceğim. Şimdilik kalıtımı incelemeye devam edelim."