VB.NET и ООП - общие методы и базовые свойства - PullRequest
1 голос
/ 25 февраля 2009

Если вы не можете использовать Me. в методе неэкземпляра, как бы вы использовали свойства / функции из базового класса в методе Shared?

Например, ClassB наследуется от ClassA
ClassB имеет Shared Method DoWork(); ClassA имеет ReadOnly Property SecurityKey

Как мне ...

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

Ответы [ 5 ]

3 голосов
/ 25 февраля 2009

Если вы не можете использовать «Я». в методе неэкземпляра, как бы вы использовали свойства / функции из базового класса в методе Shared?

Ты не можешь. Общие методы (и static в C #) плохо работают вместе с ООП. Это (то есть тот факт, что статические / совместно используемые методы не могут быть виртуальными / переопределяемыми) является возможно недостатком дизайна в .NET-системе, который был «унаследован» от Java. Общие методы на самом деле не являются объектными методами, скорее это глобальные методы с областью имен.

Кроме того, и, возможно, даже в большей степени относящейся к вашей проблеме, вам всегда нужен экземпляр для доступа к необщему методу (который, будучи общим, не принадлежит ни одному конкретному экземпляру).

2 голосов
/ 25 февраля 2009

Доступ к общим членам осуществляется по имени класса, а не по идентификатору экземпляра. IE: ClassA.DoWork() Вы не можете получить доступ к элементам экземпляра из общих методов / членов, поскольку они имеют разную область видимости. Однако вы можете получить доступ к общим членам из области действия экземпляра, не используя идентификатор экземпляра.

Попробуйте передать экземпляр класса вашему методу или создать экземпляр класса в общем методе.

Public Shared Sub DoWork(instance As ClassB)
    Dim test As String = instance.WhateverProperty;
End Sub
1 голос
/ 25 февраля 2009

Используя ваши примеры:

Какой экземпляр ClassA должен получить общий ClassB.DoWork() при попытке обратиться к свойству Me.SecurityKey?

Если вы сделаете свойство ClassA.SecurityKey также совместно используемым, это будет иметь немного больше смысла, но тогда отношения наследования больше не будут важны. С тем же успехом вы можете сказать ClassA.SecurityKey внутри этого метода, потому что вам все равно придется знать о ClassA, чтобы знать о его унаследованном свойстве.

Если вы сделаете ClassB.DoWork() как метод экземпляра, а не как общий метод, вы можете использовать ключевое слово MyBase в VB.Net для ссылки на унаследованное свойство ClassA, даже если ClassB перегружает или скрывает его.

0 голосов
/ 25 февраля 2009
Dim s as SecKey = ClassA.SecurityKey

Это извлекается из общего метода. Помните, что общие методы являются общими для всех экземпляров класса, поэтому вы можете использовать имя класса для их извлечения.

0 голосов
/ 25 февраля 2009

Если вы находитесь в статическом контексте, вам нужно создать экземпляр этого класса для доступа к его членам экземпляра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...