powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Генерация метода в наследниках.
9 сообщений из 9, страница 1 из 1
Генерация метода в наследниках.
    #34642053
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такая задача. Для всех классов наследников Dummy.Super создавать метод класса для создания новых экземпляров класса. Т.е. параметры метода -- значения для полей класса, а в методе создается и сохраняется новый экземпляр этого класса с заданными значениями полей.
Чтобы для каждого такого класса не писать свой метод, в исходном классе Dummy.Super был создан генератор, который при компиляции смотрит, какие есть поля у класса и в создаёт в классе метод с соответствующими параметрами.
Вот класс Dummy.Super :
Class Dummy.Super Extends %Persistent
{

ClassMethod MyNew() [ CodeMode = objectgenerator ]
{
s mname="New"
q:%class.Name="Dummy.Super" $$$OK
s class=##class(%Dictionary.ClassDefinition).%OpenId(%class.Name)
s ms=class.Methods
s last=ms.Count()
f i=1:1:last {
if ms.GetAt(i).Name=mname {
d ms.RemoveAt(i)
q
}
}
s m=##class(%Dictionary.MethodDefinition).%New()
s m.Name=mname
s fs="id As %Integer"
f i=1:1:class.Properties.Count() {
s prop=class.Properties.GetAt(i)
continue:prop.Calculated
s $P(fs,",",$L(fs,",")+1)=prop.Name_" As "_prop.Type
}
s m.ClassMethod=1
s m.FormalSpec=fs
d m.Implementation.WriteLine(" q 1")
d class.Methods.SetAt(m,last+1)
d class.%Save()
Do %code.WriteLine(" Quit")
Quit $$$OK
}

}
А вот его наследник Dummy.Child1 :
Class Dummy.Child1 Extends Dummy.Super
{

ClassMethod New(id As %Integer, a As %String)
{
q 1
}

Property a As %String;

}

Метод New в этом наследнике был сгенерирован методом MyNew класса Dummy.Super.

Так вот, при компиляции класса Dummy.Child1 проблем никаких нет -- метод создаётся, а когда
компилируется класс Dummy.Super с опцией "компилировать зависимые классы", то выдается ошибка : ОШИБКА #5488: Неверный формат Dummy.Child1.New формальной спецификации method, ожидалось <identifier> [OFFSET=15]

Может кто сталкивался, или я вообще не так эту задачу решаю.
...
Рейтинг: 0 / 0
Генерация метода в наследниках.
    #34642401
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На вашем бы месте я вторым параметров поставил %List - и все поля передовал внутри него.

Формальное описание метода New неизменно.

Генератор перемещается внутрь него и всего лишь разбирает по порядку список приводя в соотвествие с полями.

И транзиентные свойства нужно так же пропускать наравне с вычислимыми
...
Рейтинг: 0 / 0
Генерация метода в наследниках.
    #34642405
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И кстати да - у наследуемых и перегружаемых методов нельзя менять состав и количество формальных параметров.

Можно еще менять тип параметров на совместимый - но с оговорками.

Так что - таки да - совершенно неверно решаете
...
Рейтинг: 0 / 0
Генерация метода в наследниках.
    #34642416
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто я этот метод вызываю из csp-страницы #server-ом, там ведь список вроде нельзя формировать.
Иерархия у меня не глубокая -- только один уровень, поэтому я вставил в родительский класс проверку q:%class.Name="Dummy.Super" $$$OK , чтобы в нём этот метод не генерировался. Так что у меня нет перегрузки методов.
...
Рейтинг: 0 / 0
Генерация метода в наследниках.
    #34642691
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо списка можно использовать строку с разделителем. Разделитель только по душе подобрать.

Метод перепределяется в унаследованных классах.

класс А - методо New(id ,a )

класс B (А)- методо New(id ,a, b)

класс C (B)- методо New(id ,a, b ,c)

класс D (A)- методо New(id ,a, b , d)

Так нельзя. Можно перегружать и переопределять код, можно вызывать родительский код - но менять список и формат формальных параметров нельзя.

IMXO
...
Рейтинг: 0 / 0
Генерация метода в наследниках.
    #34643837
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, про разделитель как-то не подумал.
А насчёт переопределения методов. Иерархия у меня в два уровня -- суперкласс и его прямые потомки, причём в суперклассе метод не создаётся, только в <b>прямых</b> потомках. Поэтому перегрузки нет.
...
Рейтинг: 0 / 0
Генерация метода в наследниках.
    #34643968
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это тогда что такое ?
Код: plaintext
1.
2.
3.
ClassMethod New(id As %Integer, a As %String)
{
q  1 
}
...
Рейтинг: 0 / 0
Генерация метода в наследниках.
    #34643974
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не ... обшибся :)
...
Рейтинг: 0 / 0
Генерация метода в наследниках.
    #34653592
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблему решил так :
вместо
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	s ms=class.Methods
	s last=ms.Count()
	f i= 1 : 1 :last {
		if ms.GetAt(i).Name=mname {
			d ms.RemoveAt(i)
			q 
		}
	}
вставил
Код: plaintext
1.
2.
3.
if ##class(%Dictionary.MethodDefinition).%ExistsId(%class.Name_"||"_mname) { 
  d ##class(%Dictionary.MethodDefinition).%DeleteId(%class.Name_"||"_mname)
}
Т.е., чтобы не возникало конфликта сигнатур, метод New перед созданием из класса удаляется.
Поскольку, повторюсь, иерархия у меня только на один уровень, такое решение вполне устраивает.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Генерация метода в наследниках.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]