2016-03-22 13 views
3

Belki de sorunun adı uygun değildir, çünkü bir modüldeki yöntemler gölgelenemez, ancak özünde tekrar beyan eden bir temel üyeye gölge düşürmek ve onu arama fırsatını kaybetmeden gizlemek istiyorum. uygun değer.Modülde Object.Equals() yöntemi nasıl kullanılır?

Normalde ben Sınıflar için bunu:

<EditorBrowsable(EditorBrowsableState.Never)> 
Public Shadows Function Equals(ByVal obj As Object) As Boolean 
    Return MyBase.Equals(obj) 
End Function 

Ve bu Yapıları için:

<EditorBrowsable(EditorBrowsableState.Never)> 
Public Shadows Function Equals(ByVal obj As Object) As Boolean 
    Return Object.Equals(obj, Me) 
End Function 

Bir modül ile bu davranışı yeniden oluşturmaya çalışırken bulmak sorun, ben doldurmak için kullanması gereken budur Aşağıdaki örnekte bulunan sorgulama argümanı, Me'u kullanamadığımdan, modülün adını veya yapıcısını kullanamıyorum, anlıyorum, ama ne kullanmam gerekiyor?

Module TestModule 

    <EditorBrowsable(EditorBrowsableState.Never)> 
    Public Function Equals(ByVal obj As Object) As Boolean 
     Return Object.Equals(obj, ?) 
    End Function 

End Module 
+0

o ne işe yarayacaktır ki olsa iyi tasarım gibi görünmüyor? – Plutonix

+0

@Plutonix Yorumlarınız için teşekkürler. Nedeni sadece tasarım için, ben çok kaprisli desiging sınıflarıyım, Sınıflarımın bir Equellisense otomatik tamamlama kutusunu, Equals veya ReferenceEquals gibi çoğu senaryoda asla kullanmayacağım temel yöntemleri kullanmadan görmek istiyorum, bunları tasarım için saklıyorum, ama onları verimlilik için arama yeteneğini kaybetmek istemiyorum. – ElektroStudios

+1

Bunun işe yarayıp yaramadığını bilmiyorum, ama bu VB Modülü konsepti oldukça fazla bir IDE zorlaması. Geçerli çözümün bir parçası olmayan bir sınıf kitaplığında (dll) ' 'öğesini uygularsanız," Paylaşılan "üyelerinin bir VB Modülündeymiş gibi görüneceğini görürsünüz. . – TnTinMn

cevap

0

Bu fonksiyon, Nesne tanımlanan, sen gölge çalıştığınız biri gibi görünüyor. "Eşittir" Gördüğünüz IntelliSense sizin modül adı paylaşılan biridir sonra önermek:

Public Shared Function Equals (objA As Object, objB As Object) As Boolean 

Onları documentation ayrı listelenmiş görebilirsiniz.IntelliSense onu düşündüren durdurmak için sadece modülünde bu şunlardır:

<EditorBrowsable(EditorBrowsableState.Never)> _ 
Public Function Equals(objA As Object, objB As Object) As Boolean 
    Return Object.Equals(objA, objB) 
End Function 

Bu standart `Object.Equals` yürütmesini eğer

+0

Visual Studio 2015'e yeni yükselttim ve şu anda sorumumun anlamsız hale geldiğini görüyorum, çünkü bu yeni IDE'de artık Equals ve ReferenceEquals yöntemleri, modüllerde Intellisense tarafından gösterilmiyor (belki de bu yöntemlerin bir modülde herhangi bir anlamı olduğunu belirtiyorlar) , bu yüzden onları gizlemek için şimdi bir şey gölgelemek zorunda değilim ... – ElektroStudios

+0

Paylaşılan işlev hakkında söylediklerini doğrulamak için VS2013'e geri dönemem, bu kadar çok güvenmiyorum yanlış metodu gölgelemeye çalışıyordu, bu durum benim için bir başarısızlık olduysa, bu durum farkedilmediyse, yöntem imzası farkını uygun bir şekilde fark ettim, her neyse ... Doğrulayamıyorum ama probablly doğru olurdu, o zaman kabul ediyorum senin cevabın. Teşekkürler. – ElektroStudios

+0

@ElektroStudios bu sorunun nasıl çözüldüğünü açıklamak ister, merak ediyorum. Kabul ettiğin cevap hala neden açıklayamadığım hakkında detaylardan yoksun ... – Codexer

2

Bunun için kurallar vardır ... ve basitçe yapamazsınız.

Shadows'u yalnızca sınıf düzeyinde kullanabilirsiniz. Bu, bir Gölgeler öğesinin bildirim içeriğinin bir sınıf olması gerektiği anlamına gelir; kaynak dosya, ad alanı, arabirim, modülü, yapı veya yordam olamaz.

Bu, bir yapı ve sınıfta ... lütfen

here daha bakın nedeni olduğuna inanılmaktadır. Altta, gölgelerin hangi bağlamda mevcut olabileceğini söylüyor.

Düzenleme - Çözüm

Eğer iki nesne eşit olup olmadığını belirlemek için kendi işlevi oluşturmak standart bir veya ne zaman kullanabileceğini hiç Object.Equals çağırmak için neden isteyeyim Emin değilim.

İşte denenmiş ve test olmuştur o kapalı çalışabilir basit bir çözümdür. Ayrıca, Equals'u birçok nesneye karşı kullanmak isterseniz, daha sonra Equals işlevini gölgeleyecek şekilde karşılaştırdıklarınız için daha fazla yapıya sahip olmanız gerekir. Equals bir String döndürür neden

Module TestModule Sub Main() Dim a As New Person("Stack", "Overflow") Dim b As New Person("Stack", "Overflow") Console.WriteLine(a.Equals(b)) End Sub Public Structure Person Private FirstName As String Private LastName As String Public Sub New(firstName As String, lastName As String) Me.FirstName = firstName Me.LastName = lastName End Sub <EditorBrowsable(EditorBrowsableState.Never)> Public Shadows Function Equals(ByVal obj As Object) As String Return If(Object.Equals(obj, Me), "TRUE", "FALSE").ToString End Function End Structure End Module 

Şimdi tabii ki aksi takdirde Yapamam, bilerek yüzden ben farklı bir türü dönen olarak temel sınıfı gölge yapar görebilirsiniz bunu, merak ediyor olabilirsiniz. Bir Boolean döndürmek ve dönüşü değiştirmek için bu işlevi değiştirebilirsiniz ve iyi çalışır.

Public Overridable Function Equals (obj As Object) As Boolean 

Ancak bu modülde yok:

+0

Yardımın için teşekkürler, ama bir yapıya bir yapı eklemek (boş olacak ve benim durumumda bir amacı olmayan) aklımdaki gibi değil. Halihazırda sadece “Equals” ismiyle fonksiyonu ilan eden modül seviyesinde gölgelemeyi simüle ediyorum, ama hangi şekilde Object.Equals() içerisine çağırmam gerektiği konusunda biraz kaybolanıyorum. modül olmak). Bir nesneyi bir modülle karşılaştırmak için Microsoft'un ** Object.Equals ** için ikinci argüman olarak ne dediğini keşfetmeye çalışmak için çevrimiçi .Net Framework referansını incelemeye çalışacağım. Yine de teşekkürler! – ElektroStudios

İlgili konular