• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

некоторые особенности в LS Class

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
про деструктор
в LS он называется Delete
в нём можно делать различные действия, НО... он вызывается при уничтожении объекта, а оно происходит и в случае ошибок кода (тот самый Error)
"неприятность" в том, что мы там исключения часто не ждём, а оно запросто "проходит мимо"
т.е. исключение произошло где-то в коде, но не в деструкторе, а мы должны на это среагировать, дабы место (Errl) и текст не потерять
если это не отработать и вызвать далее действия с обработчиками ошибки - получим что-то невнятное типа "обращение к неинициализированому динамическому массиву" по месту - "хз где"
вариант обработки
Visual Basic:
    Sub Terminate
    Description: destroy object
    %END REM
    Sub Delete()
        Dim routineName As String
        routineName="Delete"
        On Error GoTo ErrH
        'your code here
        'try to save document have been marked for save
        Print {Class:} TypeName(Me) {-> Destructor}
        Dim err_ As Integer
        err_=Err
        If err_>0 Then
            'что-то пошло не так и обработку в объекте надо сворачивать
        Else
            'всё норм мы идем дальше
            If me.AutoSave Then Me.Save
        End If
Quit:
        Exit Sub
ErrH:
        Error Err, Me.RaiseError
    End Sub
 
Последнее редактирование:
  • Нравится
Реакции: alexas1

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
конструктор
называется New
конструктор может быть только один, КМК это связано с невозможностью в ЛС сделать две ф-ции с одинаковым названием (но разными аргументами)
основные особенности связаны с наследованием...
наследуемый конструктор должен включать инициализацию предка, если там есть аргументы
типа
Visual Basic:
Class MyBase
Sub New(parameter)
...
End Sub
...
End Class

Class MyClass As MyBase
Sub New(), MyBase(parameter)
...
End Sub
...
End Class
основная "проблема" передать параметр если он, по логике, должен вычисляться
полагаю такая особенность - следствие отсутствия возможности называть ф-ции одинаково
и непонятной необходимостью вызова конструктора базового класса
одним из способов "обхода" (если нужно) - вынос инициализации в отдельную ф-цию типа Function Init(params)

конструктор родительского класса вызывается первым, обойти это я не вижу способа, Init (с переопределением) может только усугубить ситуацию (придется анализировать источник типа If Me IsA "ClassA" Then)

отсюда вытекает ещё один "фокус" - если инициализируем поле класса в родителе - оно будет уже установлено в дочернем конструкторе
ситуация:
-используем поле в деструкторе
-в дочернем конструкторе произошло исключение
-поле в деструкторе будет иметь значение родителя
что вынуждает нас повторно инициализировать поле в дочернем конструкторе, до возможности получения исключения
 
Последнее редактирование:
  • Нравится
Реакции: alexas1
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!