Возможна ли инициализация объекта класса в момент передачи параметра в

  • Автор темы fedotxxl
  • Дата начала
F

fedotxxl

Пример конструкции, которую я хочу заставить работать
Код:
Call Me.addButton(new makeAgreementButton())
Не работает, а очень бы хотелось =(
 
N

nvyush

LotusScript — это Вам не Java ;)
Можно извернуться как-то так:
Код:
Dim holder As Variant
Call Me.addButton(getAgreementButton(holder)) ', где getAgreementButton — функция с кодом типа

Function getAgreementButton(holder As Variant) As Variant
Set holder = new makeAgreementButton()
Set getAgreementButton = holder
End Function
Изврат с holder вызван тем, что по выходу из процедуры/функции временные объекты виртуальной машиной утилизируются.
 
F

fedotxxl

Не... именно хотелось уменьшить кол-во строк кода
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
fedotxxl
нет, так делать нельзя
и суть не в убогости скрипта а в убогости понимания ситуации

вы передаёте только что созданный обьект, который негде не использован и нигде не присвоен
если в основном коде он реально вам НЕ НУЖЕН то передавайте Nothing а уже внутри функции создавайте его и живите им

так делать принципиально нельзя ни в одном языке - если мы заговорили о правильности кода
 
T

TIA

Изврат с holder вызван тем, что по выходу из процедуры/функции временные объекты виртуальной машиной утилизируются.

Ничего подобного. Утилизируются когда больше нет ссылок на объект. Так что так вполне можно:

Код:
Call Me.addButton(getAgreementButton()) ', где getAgreementButton — функция с кодом типа

Function getAgreementButton() As AgreementButton
Set getAgreementButton = new makeAgreementButton()
End Function

Предположу, что ввела в заблуждение другая ситуация. Когда внутри метода получается объект-контейнер (например NotesDatabase), а через него содержимое (NotesDocument). Типа такого:

Код:
sub foo()
if getDoc() is nothing then MsgBox "Всегда True"
end sub

function getDoc as NotesDocument
Dim db as NotesDatabase
...
Set db=ns.GetDatabase(...)
Set getDoc = db.getDocumentByUnid(...)
end function

При выходе из метода не остаётся ссылок на базу и её хэндл закрывается. Как следствие, уничтожаются LS-объекты, полученные через неё.

так делать принципиально нельзя ни в одном языке
Мда!? Ручаешься?
 
N

nvyush

Предположу, что ввела в заблуждение другая ситуация. Когда внутри метода получается объект-контейнер (например NotesDatabase), а через него содержимое (NotesDocument)
В точку.
так делать принципиально нельзя ни в одном языке - если мы заговорили о правильности кода
IBM другого мнения. Ищем в справке дизайнера "Examples: generateXML method" и находим в тесте примера строки:
C++:
		BufferedWriter bw = new BufferedWriter(new
FileWriter("c:\\temp\\document.xml"));
 
T

turumbay

Пример конструкции, которую я хочу заставить работать
Код:
Call Me.addButton(new makeAgreementButton())
через метод работать не будет. если совсем невмоготу, то можно заменить вызов Call foo(param) на Set foo = param
Код:
property set addButton() As Button
' в предположении, что добавляем кнопку в List:
Set buttons( ... ) = addButton
...
end property
...
' тогда вместо Call Me.addButton(new makeAgreementButton()) юзаем:
Set me.addButton = new makeAgreementButton()
но, имхо, минусы такого сеттера первешивают плюс от экономии строки.
И еще есть подводные камни: link removed
 
Мы в соцсетях:

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