Bu, aşırı yükler, gölgeler ve geçersiz kılmalar arasındaki farkları kapsayan bir mini seriden biridir. VB.NET. Bu makalede Geçersiz Kılmalar ele alınmaktadır. Diğerlerini kapsayan makaleler burada:
-> Aşırı Yükler
-> Gölgeler
Bu teknikler çok kafa karıştırıcı olabilir; bu anahtar kelimelerin ve temeldeki kalıtım seçeneklerinin bir çok kombinasyonu vardır. Microsoft'un kendi belgeleri konu adaletini yapmaya başlamıyor ve web'de çok sayıda kötü veya güncel olmayan bilgi var. Programınızın doğru kodlandığından emin olmanız için en iyi tavsiye, "Test et, test et ve tekrar test et." Bu dizide, farklılıklara vurgu yaparak onlara birer birer bakacağız.
geçersiz kılar
Gölgelerin, Aşırı Yüklerin ve Geçersiz Kılmaların ortak noktası, olanları değiştirirken öğelerin adını yeniden kullanmalarıdır. Gölgeler ve Aşırı Yükler, aynı sınıfta veya sınıf mirasları başka bir sınıf. Ancak geçersiz kılmalar, yalnızca bir alt sınıftan miras alınan türetilmiş bir sınıfta (bazen alt sınıf olarak da adlandırılır) temel sınıf
(bazen üst sınıf olarak da adlandırılır). Ve Geçersiz Kılmalar çekiç; temel sınıftan bir yöntemi (veya özelliği) tamamen değiştirmenize olanak tanır.Sınıflar ve Gölgeler anahtar sözcüğü ile ilgili makalede (Bkz: VB.NET'te Gölgeler), devralınan bir yordama başvurulabileceğini gösteren bir işlev eklendi.
Kamu Sınıfı Profesyonel '... kod gösterilmiyor... Genel İşlev HashTheName ( ByVal nm As String) As String. Dönüş nm. GetHashCode. Bitiş Fonksiyonu. Son Sınıf.
Bu sınıftan türetilen bir sınıfı başlatan kod (örnekte CodedProfessionalContact), devralındığı için bu yöntemi çağırabilir.
Örnekte, VB.NET'i kullandım GetHashCode kodu basit tutmak için bir yöntem ve bu oldukça yararsız bir sonuç verdi, -520086483 değeri. Bunun yerine farklı bir sonuç döndürülmesini istedim, ancak,
-> Temel sınıfı değiştiremiyorum. (Belki de sahip olduğum tek şey bir satıcıdan kod derlemektir.)
... ve ...
-> Arama kodunu değiştiremiyorum (Belki bin kopya var ve bunları güncelleyemiyorum.)
Türetilmiş sınıfı güncelleyebilirsem, döndürülen sonucu değiştirebilirim. (Örneğin, kod güncelleştirilebilir bir DLL dosyasının parçası olabilir.)
Bir sorun var. Çok kapsamlı ve güçlü olduğu için, temel sınıftan Geçersiz Kılmalar'ı kullanma izniniz olmalıdır. Ancak iyi tasarlanmış kod kütüphaneleri bunu sağlar. (Sizin kod kitaplıklarının tümü iyi tasarlanmış, değil mi?) Örneğin, yeni kullandığımız Microsoft tarafından sağlanan işlev geçersiz kılınabilir. İşte sözdiziminin bir örneği.
Tam Olarak Geçersiz Kılınabilen İşlev GetHashCode
Dolayısıyla, bu anahtar kelime örnek taban sınıfımızda da bulunmalıdır.
Genel Geçersiz Kılınabilir İşlev HashTheName ( ByVal nm As String) As String.
Yöntemi geçersiz kılma artık Geçersiz Kılmalar anahtar kelimesiyle yeni bir tane sunmak kadar basit. Visual Studio, kodu AutoComplete ile sizin için doldurarak yine size bir başlangıç sağlar. Girdiğin zaman ...
Genel Geçersiz Kılma İşlevi HashTheName (
Visual Studio, yalnızca temel sınıftan özgün işlevi çağıran return deyimi de dahil olmak üzere, açılış parantezini yazar yazmaz kodun geri kalanını otomatik olarak ekler. (Yalnızca bir şey ekliyorsanız, bu genellikle yeni kodunuz yine de yürütüldükten sonra yapılması iyi bir şeydir.)
Genel Geçersiz Kılma İşlevi HashTheName ( nm As String) As String olarak. MyBase'i iade edin. HashTheName (nm) Bitiş Fonksiyonu.
Bu durumda, ancak, nasıl yapıldığını göstermek için yöntemi eşit derecede yararsız başka bir şeyle değiştireceğim: Dizeyi tersine çevirecek VB.NET işlevi.
Genel Geçersiz Kılma İşlevi HashTheName ( nm As String) As String olarak. Microsoft'u iade edin. Visual Basic. StrReverse (nm) Bitiş Fonksiyonu.
Şimdi arama kodu tamamen farklı bir sonuç alır. (Gölgeler hakkındaki makaledeki sonuçla karşılaştırın.)
Kişi Kimliği: 246. İşletme Adı: Villain Defeaters, GmbH. İşletme Adı: Hash: HbmG, sretaefeD nialliV.
Özellikleri de geçersiz kılabilirsiniz. 123'den büyük ContactID değerlerine izin verilmeyeceğine ve varsayılan olarak 111 olması gerektiğine karar verdiğinizi varsayalım. Özelliği geçersiz kılabilir ve özellik kaydedildiğinde değiştirebilirsiniz:
Özel _ContactID Tamsayı Olarak. Genel özellik ContactID değerini tamsayı olarak geçersiz kılar. Almak. _ContactID öğesini döndürün. Son Alın. Set (ByVal değeri Tamsayı Olarak) Değer> 123 ise. _ContactID = 111. Başka. _ContactID = değer. End If. Bitiş Kümesi. Son Özellik.
Sonra daha büyük bir değer iletildiğinde bu sonucu alırsınız:
Kişi Kimliği: 111. İşletme Adı: Damsel Rescuers, LTD.
Bu arada, şimdiye kadar örnek kodda, Yeni'de tamsayı değerleri iki katına çıkarıldı altyordamı (Gölgeler hakkındaki makaleye bakın), böylece 123 tamsayısı 246 olarak değiştirilir ve sonra tekrar 111 olarak değiştirilir.
VB.NET, bir temel sınıfın temel sınıftaki MustOverride ve NotOverridable anahtar sözcüklerini kullanarak türetilmiş bir sınıfın geçersiz kılınmasını gerektirmesine veya reddetmesine izin vererek daha da fazla denetim sağlar. Ancak bunların her ikisi de oldukça spesifik durumlarda kullanılır. İlk olarak, Tersine çevrilemez.
Bir ortak sınıf için varsayılan NotOverridable olduğundan, bunu neden belirtmeniz gerekir? Temel sınıftaki HashTheName işlevinde denerseniz bir sözdizimi hatası alırsınız, ancak hata iletisinin metni size bir ipucu verir:
Başka bir yöntemi geçersiz kılmayan yöntemler için 'NotOverridable' belirtilemez.
Geçersiz kılınmış bir yöntem için varsayılan değer tam tersidir: Geçersiz kılınabilir. Geçersiz kılmanın kesinlikle orada durmasını istiyorsanız, bu yöntemde NotOverridable'ı belirtmeniz gerekir. Örnek kodumuzda:
Herkese Açık Değil geçersiz kılar İşlev HashTheName (...
Daha sonra CodedProfessionalContact sınıfı sırayla devralınırsa ...
Genel Sınıf NotOverridableEx. Şifrelenmiş Profesyonelİletişim.
... HashTheName işlevi bu sınıfta geçersiz kılınamaz. Geçersiz kılınamayan bir öğeye bazen kapalı eleman denir.
Temel bir parçası .NET Vakfı her belirsizliğin ortadan kaldırılması için her sınıfın amacının açıkça tanımlanmasını zorunlu kılmaktır. Önceki OOP dillerinde bir soruna “kırılgan taban sınıfı” deniyordu. Bu, bir üs class, bir alt sınıftan bir tabandan devralınan yöntem adıyla aynı ada sahip yeni bir yöntem ekler sınıf. Alt sınıfı yazan programcı, temel sınıfı geçersiz kılmayı planlamamıştır, ancak yine de tam olarak budur. Bunun yaralı programcının ağlamasıyla sonuçlandığı bilinmektedir, "Hiçbir şeyi değiştirmedim, ancak programım çöktü "Bir sınıfın gelecekte güncellenme olasılığı varsa ve bu sorunu oluşturursanız, şu şekilde bildirin: NotOverridable.
MustOverride genellikle Soyut Sınıf olarak adlandırılan şeyde kullanılır. (C # 'da aynı şey Özet! Anahtar sözcüğünü kullanır.) Bu sadece bir şablon sağlayan bir sınıftır ve bunu kendi kodunuzla doldurmanız beklenir. Microsoft bu bir örneği sağlar:
Kamu Sınıfı Çamaşır Makinesi. Alt Yeni () 'Sınıfı başlatan kod buraya gidiyor. Sub. Kamu Alt Yıkama Altını Aşmalıdır. Genel Alt Durulama Alt Durulama (loadSize olarak Tamsayı) Genel MustOverride İşlev Spin (Tamsayı olarak hız) Uzun. Son Sınıf.
Microsoft'un örneğine devam etmek için, çamaşır makineleri bu şeyleri (Yıkama, Durulama ve Sıkma) oldukça farklı yapacak, bu nedenle temel sınıftaki işlevi tanımlamanın bir avantajı yok. Ancak bunu devralan herhangi bir sınıfın yapar tanımlayın. Çözüm: soyut bir sınıf.
Aşırı Yükler ve Geçersiz Kılmalar arasındaki farklar hakkında daha fazla açıklamaya ihtiyacınız varsa, Hızlı İpucu'nda tamamen farklı bir örnek geliştirilmiştir: Aşırı Yüklere Karşı Geçersiz Kılmalar
VB.NET, bir temel sınıfın temel sınıftaki MustOverride ve NotOverridable anahtar sözcüklerini kullanarak türetilmiş bir sınıfın geçersiz kılınmasını gerektirmesine veya reddetmesine izin vererek size daha fazla denetim sağlar. Ancak bunların her ikisi de oldukça spesifik durumlarda kullanılır. İlk olarak, Tersine çevrilemez.
Bir ortak sınıf için varsayılan NotOverridable olduğundan, bunu neden belirtmeniz gerekir? Temel sınıftaki HashTheName işlevinde denerseniz bir sözdizimi hatası alırsınız, ancak hata iletisinin metni size bir ipucu verir:
Başka bir yöntemi geçersiz kılmayan yöntemler için 'NotOverridable' belirtilemez.
Geçersiz kılınmış bir yöntem için varsayılan değer tam tersidir: Geçersiz kılınabilir. Geçersiz kılmanın kesinlikle orada durmasını istiyorsanız, bu yöntemde NotOverridable'ı belirtmeniz gerekir. Örnek kodumuzda:
Herkese Açık Değil geçersiz kılar İşlev HashTheName (...
Daha sonra CodedProfessionalContact sınıfı sırayla devralınırsa ...
Genel Sınıf NotOverridableEx. Şifrelenmiş Profesyonelİletişim.
... HashTheName işlevi bu sınıfta geçersiz kılınamaz. Geçersiz kılınamayan bir öğeye bazen kapalı eleman denir.
.NET Foundation'ın temel bir parçası, tüm belirsizliğin kaldırılması için her sınıfın amacının açıkça tanımlanmasını istemektir. Önceki OOP dillerinde bir soruna “kırılgan taban sınıfı” deniyordu. Bu, bir üs class, bir alt sınıftan bir tabandan devralınan yöntem adıyla aynı ada sahip yeni bir yöntem ekler sınıf. Alt sınıfı yazan programcı, temel sınıfı geçersiz kılmayı planlamamıştır, ancak yine de tam olarak budur. Bunun yaralı programcının ağlamasıyla sonuçlandığı bilinmektedir, "Hiçbir şeyi değiştirmedim, ancak programım çöktü "Bir sınıfın gelecekte güncellenme olasılığı varsa ve bu sorunu oluşturursanız, şu şekilde bildirin: NotOverridable.
MustOverride genellikle Soyut Sınıf olarak adlandırılan şeyde kullanılır. (C # 'da aynı şey Özet! Anahtar sözcüğünü kullanır.) Bu sadece bir şablon sağlayan bir sınıftır ve bunu kendi kodunuzla doldurmanız beklenir. Microsoft bu bir örneği sağlar:
Kamu Sınıfı Çamaşır Makinesi. Alt Yeni () 'Sınıfı başlatan kod buraya gidiyor. Sub. Kamu Alt Yıkama Altını Aşmalıdır. Genel Alt Durulama Alt Durulama (loadSize olarak Tamsayı) Genel MustOverride İşlev Spin (Tamsayı olarak hız) Uzun. Son Sınıf.
Microsoft'un örneğine devam etmek için, çamaşır makineleri bu şeyleri (Yıkama, Durulama ve Sıkma) oldukça farklı yapacak, bu nedenle temel sınıftaki işlevi tanımlamanın bir avantajı yok. Ancak bunu devralan herhangi bir sınıfın yapar tanımlayın. Çözüm: soyut bir sınıf.
Aşırı Yükler ve Geçersiz Kılmalar arasındaki farklar hakkında daha fazla açıklamaya ihtiyacınız varsa, Hızlı İpucu'nda tamamen farklı bir örnek geliştirilmiştir: Aşırı Yüklere Karşı Geçersiz Kılmalar