2009-02-25 12 views
1

Si vous ne pouvez pas utiliser Me. dans une méthode non-instance, comment utiliseriez-vous les propriétés/fonctions d'une classe de base dans une méthode Shared?VB.NET et POO - Méthodes partagées et propriétés de base

Par exemple, ClassB hérite de ClassA
ClassB a une Shared Method DoWork(); ClassA a une ReadOnly Property SecurityKey

Comment puis-je ...

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

Répondre

3

Si vous ne pouvez pas utiliser "Moi." Dans une méthode non-instance, comment utiliseriez-vous les propriétés/fonctions d'une classe de base dans une méthode Shared?

Vous ne pouvez pas. Les méthodes partagées (et static en C#) ne fonctionnent pas bien avec la POO. Ceci (c'est-à-dire le fait que les méthodes statiques/partagées ne peuvent pas être virtuelles/remplaçables) est une erreur de conception dans le système .NET qui a été "héritée" de Java. Les méthodes partagées ne sont pas réellement des méthodes objet, ce sont plutôt des méthodes globales avec une portée de nom.

En outre, et peut-être même plus en rapport avec votre problème, vous avez toujours besoin d'une instance pour accéder à une méthode non partagée (qui, étant partagée, n'appartient à aucune instance particulière).

+0

Malheureusement, j'essaie d'aider certains à réparer un mess VB.NET écrit par un gars complètement non-OOP. Et j'essaie de mettre un peu de OOP pour nettoyer le désordre. Je pense que la personne utilisait des méthodes partagées de ses «classe B» pour travailler avec Object DataSources dans ASP.NET ... que je n'aurais pas utilisé ces – BuddyJoe

+0

mais bon ... J'essaie de nettoyer problème de quelqu'un d'autre sans réécrire le tout. La personne pensait écrire des objets de gestion et ils ressemblaient plutôt à des cours de «passerelle de table». – BuddyJoe

0

Si vous êtes dans un contexte statique, vous devez instancier cette classe pour accéder à ses membres d'instance.

2

Vous accédez aux membres partagés par le nom de la classe et non par un identificateur d'instance. IE: ClassA.DoWork() Vous ne pouvez pas accéder aux membres d'instance à partir de méthodes/membres partagés car leur portée est différente. Cependant, vous pouvez accéder aux membres partagés depuis la portée de l'instance sans utiliser l'identificateur de l'instance. Essayez de transmettre une instance de la classe à votre méthode ou d'instancier la classe dans la méthode partagée.

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

J'ai remarqué que si je marque ma propriété partagée en ClassA, je peux l'utiliser ... mais je ne peux toujours pas utiliser le préfixe "Moi". Y a-t-il un préfixe/mot-clé à utiliser? Quelque indice visuel/indice que cela est disponible en raison d'une classe dont j'ai hérité? – BuddyJoe

+0

Non, vous pouvez utiliser l'explorateur de classes pour vous aider à voir les modificateurs des différents membres de votre classe, mais vous ne pourrez pas accéder aux membres partagés/statiques d'un objet avec un identificateur d'instance comme Moi/this. La meilleure façon de se souvenir est que si elle est marquée Partagée, il s'agit toujours de ClassName.XXX –

1

Utilisation de vos exemples:

qui ClassA instance doit le partage ClassB.DoWork() get quand il essaie de faire référence à la propriété Me.SecurityKey?

Si vous faites également partager la propriété ClassA.SecurityKey, cela aura un peu plus de sens, mais la relation d'héritage n'est plus importante. Vous pourriez tout aussi bien dire ClassA.SecurityKey à l'intérieur de cette méthode, car vous devriez déjà savoir à propos de ClassA pour connaître sa propriété héritée de toute façon. Si vous définissez ClassB.DoWork() comme méthode d'instance plutôt que comme méthode partagée, vous pouvez utiliser le mot clé MyBase dans VB.Net pour référencer la propriété ClassA héritée, même si elle est surchargée ou occultée par ClassB.

+0

+1. Bons points. Et je pense que c'était le mot clé MyBase auquel je pensais. – BuddyJoe

0
Dim s as SecKey = ClassA.SecurityKey 

Ceci provient d'une méthode partagée. N'oubliez pas que les méthodes partagées sont partagées par toutes les instances d'une classe. Vous devez donc utiliser le nom de la classe pour les extraire.

Questions connexes