2009-02-25 8 views
1

Wenn Sie Me. nicht in einer Nicht-Instanz-Methode verwenden können, wie würden Sie Eigenschaften/Funktionen aus einer Basisklasse in einer Shared Methode verwenden?VB.NET und OOP - Gemeinsame Methoden und Basiseigenschaften

Zum Beispiel erbt von ClassBClassA
ClassB hat eine Shared Method DoWork(); ClassA hat ein ReadOnly Property SecurityKey

Wie kann ich ...

Public Sub DoWork() 
    Dim test as String = Me.SecurityKey 
End Sub 

Antwort

3

Wenn Sie "Me." Nicht verwenden Wie würden Sie in einer Nicht-Instanz-Methode Eigenschaften/Funktionen aus einer Basisklasse in einer Shared-Methode verwenden?

Sie können nicht. Gemeinsame Methoden (und static in C#) funktionieren nicht gut zusammen mit OOP. Dies (d. H. Die Tatsache, dass statische/geteilte Methoden nicht virtuell/überschreibbar sein können) ist arguably ein Entwurfsfehler im .NET-System, der von Java "geerbt" wurde. Gemeinsame Methoden sind keine Objektmethoden, sondern globale Methoden mit einem Namensumfang.

Zusätzlich und vielleicht noch mehr mit Ihrem Problem verbunden, benötigen Sie immer eine Instanz für den Zugriff auf eine nicht freigegebene Methode (die, wenn sie geteilt wird, keiner bestimmten Instanz angehört).

+0

Leider, ich versuche, einige fix ein VB.NET Chaos durch eine völlig nicht-OOP Kerl geschrieben zu helfen. Und ich versuche, ein OOP einzuschalten, um das Chaos zu beseitigen. Ich denke, dass die Person Shared-Methoden aus seiner "Klasse B" verwendet, um mit Objekt-DataSources in ASP.NET zu arbeiten ... die ich nicht verwendet hätte – BuddyJoe

+0

aber hey .... Ich versuche aufzuräumen das Problem eines anderen, ohne das Ganze neu zu schreiben. Die Person dachte, sie würden Geschäftsobjekte schreiben, und sie sind mehr wie "Table Gateway" -Klassen. – BuddyJoe

0

Wenn Sie in einem statischen Kontext sind, dann würden Sie diese Klasse instanziiert müssen seine Instanz Mitglieder zugreifen.

2

Sie greifen auf gemeinsam genutzte Member über den Klassennamen und nicht eine Instanzkennung zu .. IE: ClassA.DoWork() Sie können nicht auf Instanzmember von freigegebenen Methoden/Member zugreifen, da sie anderen Bereich sind. Sie können jedoch auf freigegebene Member aus dem Instanzbereich zugreifen, ohne die Instanzkennung zu verwenden.

Versuchen Sie, eine Instanz der Klasse an Ihre Methode zu übergeben oder die Klasse in der freigegebenen Methode instanziieren.

Public Shared Sub DoWork(instance As ClassB) 
    Dim test As String = instance.WhateverProperty; 
End Sub 
+0

Ich bemerkte, wenn ich meine Eigenschaft markiert, die in ClassA geteilt wird, kann ich sie benutzen ... aber kann immer noch nicht das Präfix "Ich" benutzen. Gibt es ein Präfix/Schlüsselwort? Irgendein visueller Hinweis/Hinweis, dass dies aufgrund einer Klasse, von der ich geerbt habe, verfügbar ist? – BuddyJoe

+0

Nein, Sie können den Klassen-Explorer verwenden, um zu sehen, welche Modifizierer verschiedene Mitglieder Ihrer Klasse haben, aber Sie können nicht auf Gemeinsame/statische Mitglieder eines Objekts mit einer Instanz-ID wie Ich/dies zugreifen. Der beste Weg ist, sich daran zu erinnern, wenn es Geteilt markiert dann ist es immer ClassName.XXX –

1

Verwenden Sie Ihre Beispiele:

Welche ClassA Instanz sollte das gemeinsame ClassB.DoWork() erhalten, wenn es die Me.SecurityKey Eigenschaft zu verweisen versucht?

Wenn Sie die ClassA.SecurityKey -Eigenschaft auch freigegeben machen, würde das ein wenig mehr Sinn machen, aber dann ist die Vererbungsbeziehung nicht mehr wichtig. Sie könnten genauso gut ClassA.SecurityKey innerhalb dieser Methode sagen, weil Sie ohnehin über ClassA wissen müssten, um über seine geerbte Eigenschaft zu wissen.

Wenn Sie ClassB.DoWork() als Instanzenmethode anstatt einer gemeinsamen Methode machen, können Sie das MyBase Schlüsselwort in VB.Net verwenden, um die geerbte KlasseA Eigenschaft zu verweisen, auch wenn ClassB Überlastungen oder Schatten es.

+0

+1. Gute Argumente. Und ich denke, es war MyBase Keyword, an das ich dachte. – BuddyJoe

0
Dim s as SecKey = ClassA.SecurityKey 

Dies zieht aus einer gemeinsamen Methode. Denken Sie daran, dass gemeinsame Methoden von allen Instanzen einer Klasse gemeinsam genutzt werden. Verwenden Sie daher den Klassennamen, um sie zu ziehen.