Хоть оно понемножку и отмирает, но... предлагаю делиться в этой теме фишками, областью применения классов на LS.
Начну) Не факт, что скажу что-то новое, но вдруг кому-то окажется полезным.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">1. Наследование "ветвлением" и убогое использование через Variant.</div></div><div class="sp-body"><div class="sp-content">
Функция-Инициализатор:
Ну и вызов с кнопки:
Использование через Variant убогое потому, что:
- не позволяет отловить ошибки на стадии компиляции;
- не позволяет пользоваться окошком ShowProperties Domino Designer'а.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">2. Наследование "ветвлением" и НОРМАЛЬНОЕ использование через тип базового класса.</div></div><div class="sp-body"><div class="sp-content">Удобно, чтобы писать универсальный код, не задумываясь как и при каких условиях он будет выполняться.
Главное условие - совпадение (потому чёткое наследование!) Public-методов.
Немного меняем базовый класс:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">3. Последовательное наследование и выполнение части работы методами базового класса.</div></div><div class="sp-body"><div class="sp-content">Удобно, когда базовый класс может работать самостоятельно, а также наследуемый класс использует часть функционала базового.
Обычно такие классы разносятся по разным библиотекам, чтобы лишний раз не грузить память и каждый раз использовать только тот функционал, что нужен в данный момент.
Если в наследующей библиотеке использовать инициализатор, как в предыдущем примере, то дополнительно получаем возможность написания однотипного кода не задумываясь над тем, где и в каких код условиях будет выполяться.
4. Обязательность конструктора наследуемых классов.
В предыдущем примере мы видим, что конструктор в классе-наследнике отсуствует... Он обязателен только, если в него передаётся хоть один параметр. Если же нет, то на конструкторе можно сэкономить
5.
Редко используемая, но интересная вещь.
Начну) Не факт, что скажу что-то новое, но вдруг кому-то окажется полезным.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">1. Наследование "ветвлением" и убогое использование через Variant.</div></div><div class="sp-body"><div class="sp-content">
Код:
Class ClassBase
Sub New(ND As NotesDocument)
End Sub
End Class
Class ClassUser As ClassBase
Sub New(ND As NotesDocument)
End Sub
Function MyFunction1()
MessageBox TypeName(Me) & "." & LSI_Info(2)
End Function
Sub UserSub()
MessageBox TypeName(Me) & "." & LSI_Info(2)
End Sub
End Class
Class ClassServer As ClassBase
Sub New(ND As NotesDocument)
End Sub
Function MyFunction1()
MessageBox TypeName(Me) & "." & LSI_Info(2)
End Function
Sub ServerSub()
MessageBox TypeName(Me) & "." & LSI_Info(2)
End Sub
End Class
Код:
Function InitClassObject(ND As NotesDocument) As ClassBase
Dim CB As ClassBase
Dim NS As New NotesSession
'Функция, собственно, и сделана для того, чтобы зашить эти ПРОВЕРКИ (их может быть море) внутрь,
'а также чтобы программист не думал где и как будет выполняться код, а просто обращался к методам и всё;
'использовать с помощью данного разделения лишь тот функционал, который нужен в данный момент.
If NS.IsOnServer Then
Set CB = New ClassServer(ND) 'Присваивание вполне нормально проходит...
Else
Set CB = New ClassUser(ND) 'Присваивание вполне нормально проходит...
End If
If Not CB Is Nothing Then 'Для уникумов, которе привыкли пихать в конструктор код, могущий привести к НЕинициализации объекта
Set InitClassObject = CB
End If
End Function
Код:
Sub Click(Source As Button)
Dim ND As NotesDocument
Dim CB As Variant
'...
Set CB = InitClassObject(ND)
If Not CB Is Nothing Then
'Variant всё схавает...:
Call CB.MyFunction1()
'Call CB.UserSub() 'Опасно, потому не имеет право на жизнь!
Delete CB
End If
End Sub
- не позволяет отловить ошибки на стадии компиляции;
- не позволяет пользоваться окошком ShowProperties Domino Designer'а.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">2. Наследование "ветвлением" и НОРМАЛЬНОЕ использование через тип базового класса.</div></div><div class="sp-body"><div class="sp-content">Удобно, чтобы писать универсальный код, не задумываясь как и при каких условиях он будет выполняться.
Главное условие - совпадение (потому чёткое наследование!) Public-методов.
Немного меняем базовый класс:
Код:
Class ClassBase
Sub New(ND As NotesDocument)
End Sub
Public Function MyFunction1()
Call Me.ShowNoBaseMsg()
End Function
Private Sub ShowNoBaseMsg()
MessageBox "Данный метод " & TypeName(Me) & "." & LSI_Info(12) & " не предназначен для прямого вызова, его необходимо переопределить и вызывать из объекта класса-наследника!", 48, "Ошибка разработчика..."
End Sub
End Class
Код:
Sub Click(Source As Button)
Dim ND As NotesDocument
Dim CB As ClassBase
'...
Set CB = InitClassObject(ND)
If Not CB Is Nothing Then
Call CB.MyFunction1() 'Объявляли как ClassBase, а пользуемся как классом-наследником, не зная что за наследник!
'Call CB.UserSub() 'А в этом варианте не прокатит уже на стадии компиляции! Имеет право на жизнь только для Private-методов...
Delete CB
End If
End Sub
Обычно такие классы разносятся по разным библиотекам, чтобы лишний раз не грузить память и каждый раз использовать только тот функционал, что нужен в данный момент.
Код:
Class ClassBE
Sub New()
End Sub
Function MyFunction1()
MessageBox TypeName(Me) & "." & LSI_Info(2)
End Function
End Class
Код:
Class ClassFE As ClassBE
Function MyFunction1()
'Собственная реализация
MessageBox TypeName(Me) & "." & LSI_Info(2)
'А также выполнение этого же метода базового класса
Me.MyFunction1 = ClassBE..MyFunction1()
End Function
End Class
4. Обязательность конструктора наследуемых классов.
В предыдущем примере мы видим, что конструктор в классе-наследнике отсуствует... Он обязателен только, если в него передаётся хоть один параметр. Если же нет, то на конструкторе можно сэкономить
5.
Ссылка скрыта от гостей
Ссылка скрыта от гостей
.Редко используемая, но интересная вещь.