Где разрешено изменение класса объекта во время выполнения

#oop #class #dynamic #types #runtime

#ооп #класс #динамический #типы #время выполнения

Вопрос:

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

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

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

Комментарии:

1. Я надеюсь, что нет. Но, возможно, я старомоден.

2. Я заметил, что вы можете изменить поведение объекта во время выполнения в Lua, изменив его метатаблицу , и спросил себя, предлагают ли другие языки аналогичные функции. Выполнение OO в Lua требует некоторой работы в реализации и TIMTOWTDI, но вы можете думать о метатаблице как о классе объекта (или метаклассе).

Ответ №1:

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

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

Возможны некоторые конструкции:

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

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

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

Комментарии:

1. Я не думаю, что он говорит о приведении.

Ответ №2:

 Give a usecase
  

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

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

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

Перейдем к вашему вопросу: вам нужна оболочка установщик. 🙂

Ответ №3:

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