2015-12-09 5 views
0

VB.net злится, когда я говорю:Как объявить объект общедоступным?

Public thisTicket as new ticket 

и настаивает на том, что нужно использовать Dim вместо Public, но это не дает мне доступ к объекту за пределами суб я заявил в

. в основном я пытаюсь сделать следующее в одном подразделам:

Public thisTicket as new ticket 

thisTicket.completed = true 

, а затем это в другой суб:

if thisTicket.completed = true then 

'do this 

else 

'do this instead 

end if 

Класс:

Public Class ticket 

    Property hasStatusChange As Boolean 

    Property initialAssignmentStatus As String 
    Property initialApprovalStatus As String 
    Property initialCompletionStatus As String 

    Property newApprovalStatus As String 
    Property newCompletionStatus As String 
    Property newAssignmentStatus As String 

    Property wasUpdated As Boolean 

End Class 

Другой вопрос,

Если бы я сделал новое свойство под билет под названием «completionChanged, как логическое»

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

Как я мог бы получить его так, чтобы я мог сказать:

if thisTicket.completionchanged = true then 

и узнайте, что это действительно так, независимо от того, правда ли это или нет, без необходимости каждый раз указывать if/then?

+4

Вы не можете объявить его 'Public' внутри sub, только снаружи на уровне класса. – OneFineDay

+0

Показать соответствующий код класса. ** Редактирование ** Да, конечно, 'Public' может использоваться только на уровне класса, а не в методе или свойстве. https://msdn.microsoft.com/en-us/library/76453kax.aspx –

+0

Я обновил свой OP классом. Другой вопрос, как я могу настроить его там, где я делаю свойство типа «Complechanged», и это свойство в основном сравнивает начальный и новый статус завершения позади сцены, чтобы увидеть, отличаются ли они, а затем, если они возвращаются, true ", так что в моем частном подчинении я мог бы просто пойти« если thisTicket.completionchanged = true then »и автоматически ли он узнать, какие критерии сделают это истинным? – user5480156

ответ

0

Если вы хотите, чтобы он был членом класса, например, свойство.

Public Property ThisTicket As Ticket 

И в конструкторе своего класса его инициализируйте.

Public Sub New() 
    ThisTicket = new Ticket 
End Sub 

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

Если вы решили сделать его приватным, вы можете обойти его создание и просто создать его как поле.

Private _thisTicket As Ticket 

Вы также должны спросить себя, действительно ли этотТикет принадлежит состоянию содержащего объекта. Содержит ли объект-объект много билетов? Возможно, билет должен быть передан в функцию обработки вместо того, чтобы содержаться. Если состояние содержащегося объекта действительно касается только одного билета на протяжении всей его жизни, то это делает его действительным.

Что касается Вашего второго вопроса ..

Создать функцию в билете, чтобы оценить бизнес-логику, вы упомянули и возвращают логическое значение, если оно изменилось или нет.

Public Function HasStatusChanged As Boolean 
    logic... 
End Function 
+0

Спасибо! Я добавил вторую часть вопроса, если вы можете ответить на это. Если мне нужно представить это как отдельный вопрос, пожалуйста, дайте мне знать. – user5480156

+0

Вы можете создать функцию в своем классе билета, чтобы сравнить исходный статус билета с текущим статусом билета и вернуть его значение boolean. Я бы воздержался от ввода такой бизнес-логики в собственность, но это мое предпочтение. – davidallyoung

1

локальной переменной в Sub или Function или имущества геттер или сеттера (т.е. в способе) живет только в то время как метод выполняется. До или после вызова этого метода локальная переменная не существует.Поэтому модификаторы, такие как Public, не имеют смысла.

Если вам нужно получить доступ к переменной извне метода, сделайте ее членом класса (поле или свойство).


Ответ на второй вопрос. Вот почему свойства существуют. Вы можете добавить к ним логику, которая выполняется при их доступе.

Private m_completionStatus As String 
Property CompletionStatus() As String 
    Get 
     Return m_completionStatus 
    End Get 
    Set(ByVal Value As String) 
     If Value <> m_completionStatus Then 
      m_completionStatus = Value 
      completionChanged = True 
     End If 
    End Set 
End Property 

И то, пожалуйста, напишите

If thisTicket.completionchanged Then 

и опускать "= истина". То, что хочет запрос If, является выражением, дающим логический результат, и булева переменная является таким выражением сама по себе. Нет никакого сравнения в инструкции If.

Если completionchanged is True, то completionchanged = True is True также. Если completionchanged - False, то completionchanged = True - False. Сравнение с «= True» немного напоминает умножение числа с 1. Это ничего не меняет.

Смежные вопросы