Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Генерация метода в наследниках.
|
|||
|---|---|---|---|
|
#18+
Есть такая задача. Для всех классов наследников 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] Может кто сталкивался, или я вообще не так эту задачу решаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2007, 17:57 |
|
||
|
Генерация метода в наследниках.
|
|||
|---|---|---|---|
|
#18+
На вашем бы месте я вторым параметров поставил %List - и все поля передовал внутри него. Формальное описание метода New неизменно. Генератор перемещается внутрь него и всего лишь разбирает по порядку список приводя в соотвествие с полями. И транзиентные свойства нужно так же пропускать наравне с вычислимыми ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2007, 20:30 |
|
||
|
Генерация метода в наследниках.
|
|||
|---|---|---|---|
|
#18+
И кстати да - у наследуемых и перегружаемых методов нельзя менять состав и количество формальных параметров. Можно еще менять тип параметров на совместимый - но с оговорками. Так что - таки да - совершенно неверно решаете ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2007, 20:33 |
|
||
|
Генерация метода в наследниках.
|
|||
|---|---|---|---|
|
#18+
Просто я этот метод вызываю из csp-страницы #server-ом, там ведь список вроде нельзя формировать. Иерархия у меня не глубокая -- только один уровень, поэтому я вставил в родительский класс проверку q:%class.Name="Dummy.Super" $$$OK , чтобы в нём этот метод не генерировался. Так что у меня нет перегрузки методов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2007, 20:45 |
|
||
|
Генерация метода в наследниках.
|
|||
|---|---|---|---|
|
#18+
Вместо списка можно использовать строку с разделителем. Разделитель только по душе подобрать. Метод перепределяется в унаследованных классах. класс А - методо New(id ,a ) класс B (А)- методо New(id ,a, b) класс C (B)- методо New(id ,a, b ,c) класс D (A)- методо New(id ,a, b , d) Так нельзя. Можно перегружать и переопределять код, можно вызывать родительский код - но менять список и формат формальных параметров нельзя. IMXO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2007, 07:26 |
|
||
|
Генерация метода в наследниках.
|
|||
|---|---|---|---|
|
#18+
Спасибо, про разделитель как-то не подумал. А насчёт переопределения методов. Иерархия у меня в два уровня -- суперкласс и его прямые потомки, причём в суперклассе метод не создаётся, только в <b>прямых</b> потомках. Поэтому перегрузки нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2007, 13:43 |
|
||
|
Генерация метода в наследниках.
|
|||
|---|---|---|---|
|
#18+
А это тогда что такое ? Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2007, 14:23 |
|
||
|
Генерация метода в наследниках.
|
|||
|---|---|---|---|
|
#18+
А не ... обшибся :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2007, 14:25 |
|
||
|
Генерация метода в наследниках.
|
|||
|---|---|---|---|
|
#18+
Проблему решил так : вместо Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. Поскольку, повторюсь, иерархия у меня только на один уровень, такое решение вполне устраивает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2007, 14:50 |
|
||
|
|

start [/forum/topic.php?fid=39&msg=34642416&tid=1559292]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
67ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 258ms |
| total: | 430ms |

| 0 / 0 |
