Где можно изменить класс объекта во время выполнения - PullRequest
0 голосов
/ 13 апреля 2011

Знаете ли вы языки программирования, где допускается (поддерживается) изменение класса объекта во время выполнения?

Пожалуйста, приведите краткий пример синтаксиса. Приведите пример использования, если вы его знаете. Также приветствуются примеры, включающие типизацию утки, поэтому не стесняйтесь упоминать эти языки.

Обновление : я понял, что Smalltalk имеет changeClassTo и become. CLOS может сделать change-class. Я нашел документ, в котором предлагается использовать эти механизмы для реализации «объектов шелухи», на которые ссылаются во время выполнения, но которые созданы из некоторого постоянства при фактическом доступе, обеспечивая некоторую изящную ленивую загрузку связанных объектов.

Ответы [ 3 ]

1 голос
/ 13 апреля 2011

Полагаю, вы имеете в виду следующее:

У вас есть объект класса A. Но вы хотели бы рассматривать его как объект класса B.

Возможно несколько конструкций:

  1. Если B является подклассом A, вы можете привести объект к B (но он должен быть создан как B, если у вас есть неожиданные (и, надеюсь, нежелательные) результаты).

  2. В некоторых языках вы можете привести что угодно к чему угодно.Если вы знаете, что делаете, это замечательно, иначе приготовьтесь к нескольким дырам в ноге.

Вы упоминаете утки.У меня нет практического опыта с этим.Но, насколько я знаю, типизация утки - это что-то вроде этого: «Мне нужен объект, который поддерживает методы X, Y и Z».В этом случае вы не заботитесь о классе.Ты просто хочешь, чтобы он крякал, плавал и ходил по твоему приказу.

0 голосов
/ 19 июня 2013

Возвращаясь к делу через некоторое время, я пришел к выводу, что вы хотите печатать утку, если чувствуете необходимость изменения класса объектов.

0 голосов
/ 13 апреля 2011
Give a usecase

??? Я ожидаю, что вы попросите решение для конкретного случая использования. Меняется тип объекта? Я думаю "Нет"

Но если вы хотите изменить часть объекта, его возможности или поведение могут быть связаны со слабой связью! Например, ваш класс содержит член типа File_Saver. Существует открытый сеттер, принимающий любой экземпляр File_Saver, и вы можете добавить File_Saver_XML, File_Saver_PDF, ...

Это не обычный способ, но любая обработка внутри класса может быть выполнена 1-n слабо связанными обработчиками, которые вы можете обменять извне.

Расслабьтесь до вашего вопроса: вам нужна обертка + сеттер. : -)

...