Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Singleton  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
Как в VFP реализовать этот pattern. Т.е. у меня есть модуль( class library) - мне хотелось бы чтобы для этого модуля во время выполнения существовал только один объект определенного класса
5 фев 04, 11:51    [522079]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
Crip
Member

Откуда:
Сообщений: 2490
Вообще-то singleton это вроде несколько другое понятие. Насколько я понимаю это тоже самое что в multithreaded apartment в СОМ.

А то что тебе нужно ищи в сторону ainstance()
5 фев 04, 12:12    [522140]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
Hel!Riser
Member

Откуда: Нижний Новгород
Сообщений: 972
без понятия ч:е это такое, но если в методе Init() объекта вернуть фальш, то объект не создаца. Соотв в нем нужно устроить проверку есть ли ссылка на этот объект или типа того
5 фев 04, 12:13    [522141]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
Crip
Member

Откуда:
Сообщений: 2490
Кстати если класс является формой то очень полезная функция
wexists() . С помощью нее обычно отключают пункт меню чтобы нельзя было повторно вызвать туже форму.
5 фев 04, 12:15    [522145]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
Por
Guest
Библиотеки классов, включенные в проект, добавляются в APP/EXE целиком во время компиляции, даже если обращения в программе к ним отсутствуют.

Так что, если задача заключается в выделении какого-то одного класса из библиотеки для использования в проекте, то эта задача решается ручками:

MODIFY CLASS ClassName OF ClassLibraryName.vcx, и последующее сохранение класса в новую библиотеку.

ЗЫ. Не стоит забывать, что у требуемого класса могут быть родители, из-за которых во время компиляции в проект целиком добавятся библиотеки, в которых они размещены.
5 фев 04, 12:17    [522150]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
Crip
Member

Откуда:
Сообщений: 2490
Добавчик к сообщению Hel!Riser
Не только в Init но и в Load()
Примеры
define class MyClass as Session

proc Init
return (ainstance(aRefs) = 1 )
enddefine

define class MyForm as Form
proc Init
return wexists("MyForm")
enddefine
5 фев 04, 12:20    [522157]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
Crip
Member

Откуда:
Сообщений: 2490
Ой последнее не правильно
define class MyForm as Form
proc Load
return !wexists("MyForm")
enddefine
5 фев 04, 12:24    [522165]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
Crip
Member

Откуда:
Сообщений: 2490
Я бы кстати сделал бы так

define class MainApplication AS Custom

func CreateSingleObject
lpara lcClassName

local array laIns[1]
local lnInstCount

lnInstCount = ainstance(laIns,lcClassName)
return iif(lnInstCount>0,laIns[1],createobject(lcClassName))

endfunc
enddefint
5 фев 04, 12:32    [522190]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
Crip
Member

Откуда:
Сообщений: 2490
Или просто функцию
func CreateSingleObject 

lpara lcClassName

local array laIns[1]
local lnInstCount

lnInstCount = ainstance(laIns,lcClassName)
return iif(lnInstCount>0,laIns[1],createobject(lcClassName))

endfunc
******************
loNewInstance = CreateSingleObject("MyClass")
5 фев 04, 12:34    [522195]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
Hel!Riser
Member

Откуда: Нижний Новгород
Сообщений: 972
:)) Crip, тихо сам с собою я веду беседу (с) :D
5 фев 04, 12:44    [522217]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
Crip
Вообще-то singleton это вроде несколько другое понятие

Singleton - это патерн описывающий класс для которого может быть создан только 1 экземпляр и присутсвует глобальная точка входа


А то что тебе нужно ищи в сторону ainstance()

Спасибо - посмотрю
5 фев 04, 12:57    [522255]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
Crip
Member

Откуда:
Сообщений: 2490
2Hel!Riser
Тоже самое хотел написать
5 фев 04, 13:10    [522297]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
Crip
Member

Откуда:
Сообщений: 2490
2funikovyuri
В чистом виде наверное не получится...
Можно комбинируя варианты которые я тебе предложил.
Описать в классе чтобы он не создавался в случае если его объект уже существует, а при создании проверять создался ли объект и получать ссылку на уже существующий
5 фев 04, 13:25    [522329]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
еще один вопрос
- есть ли в VFP статические методы-члены классов?
5 фев 04, 13:26    [522333]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
Crip
Member

Откуда:
Сообщений: 2490
Нет статических методов :(
Вместо этого надо юзать просто функции и процедуры либо объявлять методы в главном классе приложения
5 фев 04, 13:58    [522419]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
Crip

Значит я все далал правильно...
5 фев 04, 14:00    [522425]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
Crip
Member

Откуда:
Сообщений: 2490
Есть хилое подобие статических членов , которое скорее является особенностью поведения классов фокса.

Пример

o1 = new("test")

?o1.CurDate
* пауза 5 сек
o2 = new("test")
?o2.CurDate

define class Test as Session
CurDate = datetime()
enddefine
5 фев 04, 14:03    [522432]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
vklepko
Member

Откуда:
Сообщений: 144
Статических методов в VFP нет и от защищённых Init методов тоже будет мало толку.

Предлагаю создать процедуру Instance_Singleton, посредством которой допустимо создание объекта.
В Init методе сделать проверку на имя вызывающей процедуры. При попытке создать объект из другой процедуры возращать .f.


clear

x = CreateObject("_Singleton")
if Vartype(x) = "O"
?"x -"
??x.get_instance()
else
?"X can not be created"
endif
y = Instance_Singleton()
if Vartype(y) = "O"
?"y - "
??y.get_instance()
endif
z = Instance_Singleton()
if Vartype(z) = "O"
?"z - "
??z.get_instance()
endif

procedure Instance_Singleton
if Vartype(g_Singleton)<>"O" or IsNull(g_Singleton)
public g_Singleton
g_Singleton = CreateObject("_Singleton")
endif
return g_Singleton
endproc

define class _Singleton as Custom
_instance = ""
procedure Init
if Program(Program(-1)-1) <> Upper("
Instance_Singleton")
=MessageBox("
_Singleton can not be created directly."+Chr(13)+;
"
Use <<Instance_Singleton>>")
return .f.
endif
this._instance = Sys(2015)
endproc
procedure get_instance
return this._instance
endproc
enddefine
7 фев 04, 19:13    [525747]     Ответить | Цитировать Сообщить модератору
 OFF  [new]
snake
Member

Откуда: Russia, Penza
Сообщений: 2290
2funikovyuri
... ну и как тут можно работать, а?

Желаю удачи!
9 фев 04, 09:26    [526515]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
Crip
Member

Откуда:
Сообщений: 2490
2snake
Когда проектируешь приложение надо знать какие ограничения накладывает среда...
9 фев 04, 11:49    [526815]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
snake
Member

Откуда: Russia, Penza
Сообщений: 2290
особенно когда среда навязана.
9 фев 04, 11:57    [526840]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
Crip
Member

Откуда:
Сообщений: 2490
Кем и кому? Автору поста?
9 фев 04, 12:01    [526849]     Ответить | Цитировать Сообщить модератору
 Re: Singleton  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
vklepko
Большое спасибо - буду смотреть

snake
Знаешь - в принципе - как оказалось - работать можно - и даже без каких-то глобальных проблем...
Пока меня раздражают 4 вещи
- отсутсвие типизации (ну не могу я после C++ это терпеть - и постоянно накалываюсь)
- отсутствие исключений (я пока на VFP7 - вот перейду на 8-ку - и тогда этот пункт отпадет)
- отсутствие транзакций (так как я работаю с унаследованной системой которой уже более 10 лет - то большая часть кода транзкации не использует и большинство таблиц не входят в .dbc)
- ужасный грид

Еще - к сожалению любымый мной PD9.5 про VFP не слышал :)

P.S> а так - мне эту систему никто не навязывал - так что я знал на что шел...:)
9 фев 04, 13:18    [527048]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить