Polimorfizm (Çok Biçimlilik) Nedir?
Tarık Ateş
Akıllı Şebeke Çözümleri Yöneticisi
Aktif Mühendislik
Çok Biçimlilik terimi ile ne anlatılmak istendiğinden ve nesne tabanlı yazılım geliştirme dillerinde nasıl kullanıldığından bahseder.
POLİMORFİZM (ÇOK BİÇİMLİLİK) NEDİR?
Terim olarak Yunanca “çok” (πολύ) ve “biçim” (μορφή) kelimelerinin birleşmesiyle oluşmuştur. Biyolojide aynı habitatta aynı zamanda birden fazla biçimin bulunması olarak adlandırılabilir. [1]
Nesne yönenimli programlama dillerinde çok biçimlilik aynı temel sınıftan türetilmiş olan yeni sınıflarda metotların farklı şekillerde davranabilmesidir. [2]
Bir örnek ile anlatmamız gerekirse; haberleşme portu olan elektrik sayaçlarından temel olarak anlık (DRO – Data Read Out) ve yük profili (LP – Load Profile) olarak iki tipte okuma yapabiliriz. Ancak Iskraemeco gibi gelişmiş sayaç üreticilerinin Manyetik alan algılama, Kayıp/Kaçak tespiti, Güç kalitesi vb. birçok yük profili daha bulunabilir.
İşte bu gibi temelde aynı tür olan ancak farklı tiplerde aynı metotların farklı davranması gereken noktalarda çok biçimlilik yani polimorfizm’den faydalanılır.
Şimdi bu anlattığımız örneği koda dökecek olursak;
Public Class MeterBase
Public Overridable Function ReadDRO() As String
Return "anlık veriler başarıyla okundu."
End Function
Public Overridable Function ReadLP(ByVal FirstDate As Date, ByVal LastDate As Date) As String
Return " iki tarih arasındaki yük profili başarıyla okundu."
End Function
METERBASE’DEN TÜRETİLMİŞ X SAYAÇ SINIFI
Bu sayaç markası temel sayaçtan farklı olarak yük profilini iki tarih arasındaki veri olarak değil de kayıt sayısı olarak verdiğinden ReadLP fonksiyonu Overload ediliyor.
1. Public Class MeterX : Inherits MeterBase
2.
3. Public Overloads Function ReadLP(ByVal LastRegisterCount As Integer) As String
4. Return String.Format("X marka sayacın son {0} yük profili verisi okundu. ",LastRegisterCount)
5.
6. End Function
METERBASE’DEN TÜRETİLMİŞ ISKRAEMECO SAYAÇ SINIFI
Iskraemeco sayaç markası gelişmiş sayaç tipleri ürettiğinden temel sayaçtan farklı olarak yük profiline ek birçok yeni yük profilini de desteklemektedir. Bu sebeple yine ReadLP fonksiyonu Overload edilerek içerisine MeterBase sınıfı içerisindeki ReadLP fonksiyonuna ek olarak yeni Private fonksiyonlar eklenmiştir.
1. Public Class MeterIskraemeco : Inherits MeterBase
2.
3. Public Overloads Function ReadLP(ByVal FirstDate As Date, ByVal LastDate As Date) As String
4. Dim RetVal As String = String.Empty
5. RetVal = MyBase.ReadLP(FirstDate, LastDate)
6. RetVal += vbNewLine & ReadFraudDetection(FirstDate, LastDate)
7. RetVal += vbNewLine & ReadPowerQuality(FirstDate, LastDate)
8. RetVal += vbNewLine & ReadMagneticTamper(FirstDate, LastDate)
9. Return RetVal
10. End Function
11.
12. Private Function ReadFraudDetection(ByVal FirstDate As Date, ByVal LastDate As Date) As String
13. Return "İki tarih arasındaki kaçak algılama profili başarıyla okundu."
14. End Function
15.
16. Private Function ReadPowerQuality(ByVal FirstDate As Date, ByVal LastDate As Date) As String
17. Return "İki tarih arasındaki güç kalitesi profili başarıyla okundu."
18. End Function
19.
20. Private Function ReadMagneticTamper(ByVal FirstDate As Date, ByVal LastDate As Date) As String
21. Return "İki tarih arasındaki manyetik alan algılama profili başarıyla okundu."
22. End Function
ÜÇ SINIFIDA ÇALIŞTIRACAK ANA PROJE
Üç sınıfta ReadDRO ve ReadLP fonkiyonlarını içermesine rağmen özellikle ReadLP fonkiyonu her sınıfta farklı şekilde çalışmaktadır. Ayrıca ReadDRO fonksiyonu polimorfizm sayesinde sadece MeterBase sınıfında yazılmış buna rağmen türetilen tüm sınıflar içerisinde bir daha yazılmasına gerek kalmamıştır.
1. Public Class frmMain
2. Dim mBaseMeter As New PolimorfizmHelper.MeterBase
3. Dim mXMeter As New
4. PolimorfizmHelper.MeterX
5. Dim mIskraemecoMeter As New PolimorfizmHelper.MeterIskraemeco
6.
7. Private Sub btnDRO_Click(sender As Object, e As EventArgs) Handles btnDRO.Click
8. txtLog.Text = String.Empty
9. txtLog.Text += "Base sayaç " & mBaseMeter.ReadDRO
10. txtLog.Text += vbNewLine & "X sayacının " & mXMeter.ReadDRO
11. txtLog.Text += vbNewLine & "Iskraemeco sayacın " & mIskraemecoMeter.ReadDRO
12. End Sub
13.
14. Private Sub btnLP_Click(sender As Object, e As EventArgs) Handles btnLP.Click
15.
16. txtLog.Text = String.Empty
18. Dim mFirstDate = New Date(Now.Year, Now.Month, 1)
19. Dim mLastDate = New Date(Now.Year, Now.Month, 1)
20.
21. txtLog.Text += "Base sayaç " & mBaseMeter.ReadLP(mFirstDate, mLastDate)
22. txtLog.Text += vbNewLine & "X marka sayacın " & mXMeter.ReadLP(mFirstDate, mLastDate)
23. txtLog.Text += vbNewLine & vbNewLine & vbNewLine & "Iskraemeco sayacın; " & vbNewLine & mIskraemecoMeter.ReadLP(mFirstDate, mLastDate)
24. End Sub
25. End Function
REFERANSLAR
[1] Polimorfizm – Vikipedi
[2] Çok biçimlilik – Vikipedi
[3] Microsoft – How Visual Basic Provides Polymorphism