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

fedotxxl

Well-known member
09.11.2005
614
0
#1
Пример конструкции, которую я хочу заставить работать
Код:
Call Me.addButton(new makeAgreementButton())
Не работает, а очень бы хотелось =(
 

nvyush

Lotus team
22.04.2009
2 317
0
#2
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 вызван тем, что по выходу из процедуры/функции временные объекты виртуальной машиной утилизируются.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 233
18
#4
fedotxxl
нет, так делать нельзя
и суть не в убогости скрипта а в убогости понимания ситуации

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

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

TIA

:-)
Lotus team
15.05.2009
790
3
#5
Изврат с 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-объекты, полученные через неё.

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

nvyush

Lotus team
22.04.2009
2 317
0
#6
Предположу, что ввела в заблуждение другая ситуация. Когда внутри метода получается объект-контейнер (например NotesDatabase), а через него содержимое (NotesDocument)
В точку.
так делать принципиально нельзя ни в одном языке - если мы заговорили о правильности кода
IBM другого мнения. Ищем в справке дизайнера "Examples: generateXML method" и находим в тесте примера строки:
C++:
		BufferedWriter bw = new BufferedWriter(new
FileWriter("c:\\temp\\document.xml"));
 
13.03.2009
625
1
#7
Пример конструкции, которую я хочу заставить работать
Код:
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()
но, имхо, минусы такого сеттера первешивают плюс от экономии строки.
И еще есть подводные камни: http://codeby.net/index.php?showtopic=30376