| | Sınıflarda Kalıtım (Inheritance) Kavramı ASP.net miras, taban sınıf, türemiş sınıf, inherit, inheritance, base class, derived class
.NET çatısı altında OOP´un asıl amacı kodun bir kez yazıldıktan sonra sınıf haline getirilerek bir aduzayı hiyerarşisi içinde tasnif edilmesi ve gerektiğinde nesne türetilerek tekrar tekrar kullanılabilmesini sağlamaktır. Ancak, mevcut sınıfın yordam ve özellikleri yetersiz ise bu sınıftan sadece nesne türetebiliyor olması yeterli olamaz. Eğer bütün sınıfların kodu açık olsaydı kod üzerinde istediğimiz değişiklikleri yapabilir ve sınıfları geliştirebilirdik. Böyle bir imkan olmadığından, bu duruma iyi bir çözüm bulmak adına Inheritance yapısı geliştirilmiştir. Bu yapı ile bir sınıfın yordam ve özelliklerini miras alan, geliştiren ve/veya değiştiren yeni bir sınıf yazmak mümkündür.
Eğer karmaşık matematik işlemleri yapan bir sınıf yazmak istiyorsanız temel matematik işlemleri için gerekli kodları tekrar yazmak yerine zaten bu işleri yapan bir sınıftan yeni yazacağınız sınıfa gerekli yordam ve özellikleri miras yoluyla alabilirsiniz. Burada kaynak olan, kendisinin yordam ve özeliklerini alacağımız sınıfa taban sınıf (base class) denir. Özellikleri edinen yeni sınıfa ise türemiş sınıf (derived class) denir. Aslında türemiş sınıf yerine mirascı sınıf denmesi -türetme- fiilinin nesne türetme içinde kullanılıyor olması sebebiyle karışıklık olmaması için daha doğru olmaktadır. Taban sınıftan türemiş sınıfa miras olarak alınan bazı yordamları ve/veya özellikleri beğenmediğimizde bunların yerine yenilerini yazabiliriz. Buna ezmek (overriding) denir.
Frank DERFLER´in 95´lerde okuduğum ağlar (network) hakkındaki bir kitabının bölüm aralarındaki teknik hikayeleri severdim. Bu hikayeler konunun anlaşılmasını kolaylaştırıyordu. Hikaye anlatacak değilim ama konuya en azından bir örnek verebilirim.
Marangoz (Mustafa Ustamı rahmetle anıyorum) ustasının çırağına neyi nasıl yapacağını öğretmesi en iyi mirasıdır. Yani usta-çırak ilişkisi ile öğrenmede miras yoluyla geçiş sözkonusudur. Çırak ustasından yol-yordam (method), öğrenir, alet kullanama becerisini alır. Ancak temel bilgileri sabit kalarak, yeni aletler ve zamana göre zevklerin değişmesi ile çırak, ustasından öğrendiği bazı usüllerin yerine yenilerini geliştirebilir. Burada miras yoluyla geçişe Inheritance, alınan bazı yordamların ihtiyaca göre değiştirilmesine Overriding denir.
Konuyu derinleştirmeden önce üç ayrı sınıf türünün özelliklerine kısaca değinmek yerinde olacaktır.
Arabirim Sınıflar (Interface Class) Miras alınabilir, taban sınıf olabilir, nesne türetilebilir
Bu sınıflardan hem nesne türetmek mümkündür, hemde bu sınıflar başka sınıfların yazılmasında miras alınabilir, yani taban sınıf olabilirler.
Public Class TemelMatematik Public Function KareAl(piX As Integer) As Integer Return piX * piX End Function End Class
TemelMatematik sınıfını miras alma Public Class IleriMatematik Inherits TemelMatematik End Class
TemelMatematik sınıfından nesne türetme Public Class Matematik Dim T As New TemelMatematik() End Class
Somut Sınıflar (Concrete Class) NotInheritable: Miras alınamaz, taban sınıf olamaz, sadece nesne türetilebilir
Bazı sınıflar sadece nesne türetilerek kullanılması amacıyla yazılırlar. Yazılırken bu sınıfın olgun olduğu ve miras alınarak geliştirilmesinin gerekmeyeceği düşünülür. Bu sınıflar başka sınıflara taban sınıf olamaz. NotInheritable anahtar kelimesi ile tanımlanırlar.
Public Class IleriMatematik Inherits TemelMatematik End Class
Yukarıda Arabirim Sınıflar´dan bahsederken kodunu yazdığımız arabirim sınıf türündeki TemelMatematik sınıfının yordamları ve özellikleri (gerçi sadece bir tane var) IleriMatematik sınıfı tarafından miras alınmıştır.
Eğer TemelMatematik sınıfını aşağıdaki gibi NotInheritable anahtar kelimesi ile yazıp somut bir sınıf yapsaydık miras alınamazdı.
Bu sınıf miras alınamaz Public NotInheritable Class TemelMatematik Public Function KareAl(piX As Integer) As Integer Return piX * piX End Function End Class
Hemen üstteki sınıf miras alınamaz. Aşağıdaki yazım yanlıştır. Inherits TemelMatematik
Ama bu sınıftan nesne türetilebilir. Aşağıdaki yazım doğrudur. Dim T As New TemelMatematik
Soyut Sınıflar (Abstract Class) MustInherit: Mutlaka miras alınmalıdır, taban sınıf olur, nesne türetilemez
Bazı sınıflar en temel işlemleri barındırırlar ve kendi başlarına karmaşık işlemler yazmazlar. Bu sınıflar yazılırken mutlaka başka bir sınıf tarafından miras alınacakları ve daha gelişmiş yordamların yazılmasında yardımcı olacakları düşünülür. Bu sınıflara Soyut Sınıflar (Abstract Class) denir. Yani bu sınıfın yegane amacı başka sınıflara taban sınıf olmaktır. Bu sınıfdan New kelimesi ile nesne türetilemez. MustInherit anahtar kelimesi ile tanımlanırlar.
Bu sınıf mutlaka miras alınmalıdır. Nesne türetilemez. Public MustInherit Class TemelMatematik Public Function KareAl(piX As Integer) As Integer Return piX * piX End Function End Class
Hemen üstteki sınıf miras alınabilir. Aşağıdaki yazım doğrudur. Inherits TemelMatematik
Bu sınıftan nesne türetilemez. Aşağıdaki . Dim T As New TemelMatematik
----------------------------------------------------------------------
Özetle; Arabirim (Interface) Sınıflar Anahtar kelime kullanılmadan yazılan sınıflar Nesne türetilir, miras alınır.
Somut (Concrete) Sınıflar NotInheritable anahtar kelimesi ile yazılan sınıflar Nesne türetilir, miras alınmaz.
Soyut (Abstract) Sınıflar MustInherit anahtar kelimesi ile yazılan sınıflar Nesne türetilemez, miras alınır.
Bu durumda asıl konumuz olan Sınıflarda Kalıtım (Inheritance) için ele alacağımız sınıflar arabirim ve soyut sınıflar olacaktır.
----------------------------------------------------------------------
Şimdi daha sonra yazacağımız sınıflarda miras alınmak üzere bir arabirim sınıf yazalım.
Imports System
Namespace Matematik Public Class TabanSinif Public Function Topla(piS1 As Integer, piS2 As Integer) As Integer Return piS1 + piS2 End Function Public Function Cikar(piS1 As Integer, piS2 As Integer) As Integer Return piS1 - piS2 End Function Public Function Carp(piS1 As Integer, piS2 As Integer) As Integer Return piS1 * piS2 End Function Public Function Bol(piS1 As Integer, piS2 As Integer) As Integer Return piS1 / piS2 End Function Public Overridable Function Kare(piS1 As Integer) As Integer Return piS1 * piS1 End Function End Class End NameSpace
Anlaşılacağı üzere bu sınıfımız bazı temel matemetik işlemlerini yapıyor. Şimdi bu sınıfı taban sınıf olarak kullanan başka bir sınıf yazalım.
Imports System
Namespace Matematik Public Class MirasciSinif Imports TabanSinif Public Function Kup(piS1 As Integer) As Integer Return piS1 ^ 3 End Function Public Overrides Function Kare(piS1 As Integer) As Integer Return piS1 ^ 2 End Function End Class End NameSpace
Bu sınıf yukarıda kodunu yazdığım TabanSinif´ı miras olarak alıyor. Şimdi bu sınıf TabanSinif´ın bütün fonksiyonlarına sahiptir. Yani aşağıdaki yazım doğrudur;
Dim Nesne As New MirasciSinif() Nesne.Carp(3,2)
Burada MirasciSinif Carp fonksiyonunun kodunu taşımamaktadır ama TabanSinif´tan miras olarak almıştır. Hatta TabanSinif´tan miras olan fonksiyonları eksik gördüğümüz için birde Kup fonksiyonu eklenmiştir. Bu fonksiyon verilen sayının küpünü alıyor.
MirasciSinif´ın son fonksiyonu olan Kare ise daha ilginçtir. Çünkü bu isimde bir fonksiyon zaten TabanSinif´ta vardı ve miras olarak gelmişti. Ancak bu fonsiyon sayıyı kendi ile çarparak (piS1 * piS1) karesini aldığında bunu beğenmedim ve yerine sayının 2 üssünü doğrudan alan (piS1 ^ 2) yeni bir fonksiyon yazdım. İşte yeni yazdığımız fonksiyon miras gelenin üstüne biner, buna ezmek (overriding) denir. TabanSinif´ın kodunda sondaki Kare fonksiyonunun yazılışına dikkat edin Overridable (ezilebilir) anahtar kelimesini göreceksiniz. Bir yordamın ezilebilmesi için Overridable (ezilebilir) anahtar kelimesi ile tanımlanması gerekir. Bu yordamı ezen yordamın ise Overrides (ezici) anahtar kelimesi ile tanımlanması gerekir.
MirasciSinif´ın içerisinde bir yerden fonskiyonun Overriding edilmemiş aslına yani TabanSinif´ın içindeki haline erişilmek istenirse MyBase.Kare(sayi) yazımı kullanılır.
----------------------------------------------------------------------
Fonksiyonların ve değişkenlerin Public, Friend, Protected, Private anahtar kelimeleri ile tanımlanabildiğini biliyoruz.
Taban sınıfta Public olarak tanımlanan öğeye; Mirascı sınıftan erişilir. Mirascı sınıftan türetilen nesneden erişilir.
Taban sınıfta Friend olarak tanımlanan öğeye; Mirascı sınıftan erişilir. Mirascı sınıftan türetilen nesneden erişilir.
Taban sınıfta Protected olarak tanımlanan öğeye; Mirascı sınıftan erişilir. Mirascı sınıftan türetilen nesneden erişilmez.
Taban sınıfta Private olarak tanımlanan öğeye; Mirascı sınıftan erişilmez. Mirascı sınıftan türetilen nesneden erişilmez.
Elbette Inheritance kavramı bu kadarla bitmiyor. Hem konuyu pekiştirmek hemde anlamak için diğer makalelerimi okumanızı tavsiye ederim.
Bu yazı kaynak göstermek kaydıyla kısmen, tamamen veya değiştirilerek yayınlanabilir. En yeni makaleler FındıkKurdu'nda yayınlanır. http://www.findikkurdu.com
Kolay gelsin. Bir sonraki makaleye kadar esen kalın.
ufukyayla 24.10.2005 10:05:12
Taşındık Yeni Siteye Girin |
| |  | |  |  |
|
|  | Blog - ASP.NET!VB |  |
| |
|