Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
Есть набор классов, наследников базового. Надо сделать класс-массив их (один на всех). В одном экземпляре массива должны находиться экземпляры только одного из классов. Как в конструктор передать тип класса наследника и отслеживать вызов методов (например, Add) с экземпляром другого класса в качестве параметра? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2003, 14:37 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
т.е. как я понял у класса-массива будет опция которая определеяет для какого типа создан данный экземпляр? ... ну например так: type TB = class .......... end; TD1 = class .......... end; TD2 = class .......... end; TArrayB = class TypeOption : (toD1, toD2); procedure Add(const B : TB); end; procedure TArrayB.Add(const B : TB); begin case TypeOption of toD1 : if B is TD1 then ... else ...; toD2 : if B is TD2 then ... else ...; end; ..... end; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2003, 14:47 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
type TBaseClass = class(TObject) ... end; TMyClass1 = class(TBaseClass) ... end; TMyClass2 = class(TBaseClass) ... end; TMyClasses = class of TBaseClass; //------------------------------- var arr_class = array [1..2] of TMyClasses; //---- begin arr_class := TMyClass1.Create; arr_class := TMyClass2.Create; //--------------------------- // Или я тебя не понял? // Че делаем - то? end ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2003, 14:51 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
Малиновский Владимир, Что это !? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2003, 15:09 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
Вот и я о том же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2003, 15:16 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
arr_class := TMyClass1.Create; arr_class := TMyClass2.Create; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2003, 15:21 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
Что-то у меня квадратные скобки с индексами массива не выводятсся в опубликованную ерунду... Только шрифт меняется... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2003, 15:24 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
Потому, что они в тэги преобразовываются - вот и не выводятся. Наверное где-то на форуме написано, чё с ними делать, если показать надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2003, 16:13 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
Делается массив для базового класса. Все наследуемые могут в нем спокойно содержаться. Естественно, что оперировать без явных преобразований можно только методами базового класса (с учетом virtual). А то, что Вы пытаетесь сделать попахивает мультиметодами (методами, применимыми к разным классам). Не советую :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2003, 07:32 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
Да, для базового... ну а массив объект можно очень просто реализовать на основе TCollection или на TObjectList, в простейшем варианте типа Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. и все готово... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2003, 09:22 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
Возможно я не совсем корректно сформулировал мысль. Есть базовый класс, есть его наследники с интерфейсом базового класса, есть класс - набор наследников (на основе TList). В одном экземпляре класса-набора могут содержаться дофига элементов, но все - одного класса-наследника. Ситуация когда в наборе содержатся различные наследники недопустима. Чтобы не создавать кучу потомков набора (для каждого наследника свой) есть такая "идея": При создании экземпляра класса-набора в параметре constructor-а предается тип содержания. Например так: MyList:=TMyList.Create(TMyType1); Все добавляемые в набор классы костятся к TMyType1. Т.к. прикостить наследника можно только к родителю, а не к "брату" (или я ошибаюсь?), то попытка добавления в набор "брата" приведет к ошибке, чего я и добиваюсь. Вопрос: Как передать тип в Create, а затем использовать его для приведения? Т.е. чего писать в constructor Create(A:????) и как потом приводить List ^ к типу А. На данный момент я все привожу к базовому классу, что позволяет создавать "смешенные наборы", а это не допустимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2003, 11:46 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
Класс передать можно так: Код: plaintext 1. 2. 3. 4. Что насчёт того, как приводить, то не знаю, сам разбирайся... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2003, 12:44 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
TObjectList намного круче TList, поскольку самостоятельно контролирует (если это нужно, AOwnsObjects = True) уничтожение объектов своего списка! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2003, 13:03 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
TTaskFormClass ????????? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2003, 13:18 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
Откомпилировано и проверено: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. это хотел? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2003, 14:16 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
Приблизительно да. Спасибо. А что происходит с памятью выделяемой в строках CList.Add(TClass1.Create); // GOOD CList.Add(TClass2.Create); // ERROR Кажется она не очищается....? Но, как обычно, "с перламутровыми пуговицами" предпочтительней. Т.е очень хочется проверку делать не на уровне не совпадения с внутренним эталонным именем, а на уровне не совпадения типов. Поясните, что у zDIV означает класс TTaskFormClass? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2003, 14:30 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
память конечноже НЕ очищается. Я тоже не понял что это за класс TTaskFormClass. Т.е. ты хочеш чтоб тебе компилятор выдавал бы ошибку несовпадения типов?? Это исключено в принципе т.к ты ведь создаёш класс который потенциально предназначен для любоко потомка базового, откуда же компилятор может знать ПРИ КОМПИЛЯЦИИ для которого конкретного класса ты собираешся его использовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2003, 14:36 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
TTaskFormClass = class of TTaskForm TObjectList самостоятельно освобождает память своих объектов в отличие от других вариантов (более достойной альтернативой, по-моему, здесь является TCollection)!!! Необходимо изменить Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2003, 15:02 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
Это я понимаю. Но надеюсь на "run time error", ловящийся по try. Типа "авто проверки" изменяемых (добавляемых) записей. Согласись, было бы красиво, особенно авто "прикост" к дочерниму типу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2003, 15:07 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
Пардон... function TTaskFormList.CheckObject(AObject: TObject): Boolean; begin Result := Assigned(AObject) and (AObject.ClassName = FTaskFormClass.ClassName); if not Result then raise Exception.Create('Boroda'); end; Очевидно, в этом случае можно обойтись и procedure TTaskFormList.CheckObject(AObject: TObject); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2003, 15:10 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
Хотя если писать на C++ и использовать шаблоны (Template) то можно добиться такого результата (ошибка при компиляции). Но шаблоны на самом деле создают много разных классов и это тоже самое если просто в Delphi создать идентичние объекты для всех классов-потомков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2003, 15:11 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
Кстати... А в Delphi аналог Temlate есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2003, 15:13 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
не понял на счёт авто "прикоста" к дочерниму типу. .. как ты это себе представляеш? >>надеюсь на "run time error", ловящийся по try. Типа "авто проверки" >>изменяемых (добавляемых) записей. какая проблема? вместо MessageDlg(..); делай raise ... в Delphi аналогов Temlate вроде нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2003, 15:17 |
|
||
|
Как передать тип?
|
|||
|---|---|---|---|
|
#18+
2 BaseAdmin: Привести из одного дочернего типа в другой - никак не удастся штатными методами - нет таких у компилятора. Попробуй для примера, данного GroZ, написать где-нибудь : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. И это логично, т.к. компилятор не может предполагать идентичность интерфейса базового класса и его потомка. Как правило, в потомка добавлено что-то "свое", что компилятор никак не может "выбросить". Из того же примера : Вы можете создавать экземпляр объекта нужного Вам типа для массива и копировать его атрибуты из того объекта, что пытаемся присвоить. Естественно, что в этом случае, в списке будут не непосредственно присваиваемые классы, а их копии: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Также надо будет позаботиться о методе TBaseClass.Assign и об уничтожении созданных копий объектов. Я проверил - работает : на запрос i-го элемента возвращается именно объект заданного типа, какой бы ни присваивали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2003, 17:55 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=58&tid=2116756]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
66ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
79ms |
get tp. blocked users: |
2ms |
| others: | 225ms |
| total: | 421ms |

| 0 / 0 |
