2014-01-10 4 views
6

Я попытался создать класс скриптов vb с константой и получил ошибку 800A03EA. Это ошибка VBS? Разве это не основное правило ООП?Постоянный внутренний класс

Class customer 
    ' comment it const and its works 
    const MAX_LEN=70 

    Private Name 

    Private Sub Class_Initialize 
     Name = "" 
    End Sub 

    ' name property. 
    Public Property Get getName 
     getName = Name 
    End Property 

    Public Property Let letName(p_name) 
     Name = p_name 
    End Property 
end class 
+3

Это (прискорбный) факт жизни. –

ответ

11

В списке documentation перечислены все утверждения, допускаемые в контексте классов. Const нет среди них, поэтому он не поддерживается. Вы можете обойти эту проблему с помощью частных переменных-членов, которые вы инициализации во время создания экземпляра (то есть в Class_Initialize):

Class customer 
    Private MAX_LEN 
    Private Name 

    Private Sub Class_Initialize 
    MAX_LEN = 70 
    Name = "" 
    End Sub 

    ... 
End Class 

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

Class customer 
    Private MAX_LEN 

    Private Sub Class_Initialize 
    MAX_LEN = 70 
    End Sub 

    'read-only property, so no "Property Let/Set" 
    Public Property Get MaxLength 
    MaxLength = MAX_LEN 
    End Property 

    ... 
End Class 

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

+4

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

4

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

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

5

Я согласен с Ansgar Wiechersanswer, но хотел бы предложить другой вариант.

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

Class customer 

    'read-only property, so no "Property Let/Set" 
    Public Property Get MaxLength 
    MaxLength = 70 
    End Property 

    ... 
End Class 
Смежные вопросы