Какой язык может динамически изменять члена класса во время выполнения? - PullRequest
3 голосов
/ 29 августа 2010

Я знаю, что в Ruby можно динамически добавлять и изменять метод класса во время выполнения.а как насчет другого языка?что такое C #, может ли на этом языке модифицировать или добавить какой-либо метод и ... во время выполнения и динамически?

Ответы [ 5 ]

2 голосов
/ 29 августа 2010

Я думаю, вы ищете наследование прототипа . список языков упоминается на той же странице википедии.

Существует аналогичный вопрос по SO, который вы можете посмотреть.

2 голосов
/ 29 августа 2010

Да, в C # вы можете добавлять методы во время выполнения с помощью отражения и объекта Emitter .

В C # 4.0 вы даже можете сделать это простым кодом C # с помощью Expando объекта . Возможно, это ближе к Ruby-способу (это практически точная копия, если я правильно помню) и намного проще в использовании.

Редактировать: все это относится ко всем языкам .NET, включая VB.Net и F #.

1 голос
/ 30 августа 2010

Python превосходен в этой операции - вот несколько примеров: Python: изменение методов и атрибутов во время выполнения

Система объектов Lisp также довольно динамична: http://en.wikipedia.org/wiki/Common_Lisp_Object_System "CLOS является динамическим, что означает, что не только содержимое, но и структура его объектов могут быть изменены во время выполнения. CLOS поддерживает изменение определений классов на лету (даже когда экземпляры рассматриваемого класса уже существуют), а также изменениечленство в классе данного экземпляра через оператор класса изменений. CLOS также позволяет добавлять, переопределять и удалять методы во время выполнения. "

1 голос
/ 29 августа 2010

Весь смысл систем статических типов, таких как C #, состоит в том, что все функциональные возможности, определенные для определенного типа, известны (и проверены) в время компиляции .

Если вы пишете

foo.jump(42);

компилятор проверяет, что независимо от типа foo он поддерживает операцию с именем jump, принимающую целочисленный параметр.

Недавно в C # появилась возможность динамически проверять объекты с помощью типа dynamic, что в основном допускает то, что вы описали в очень ограниченном контексте, но, тем не менее, общий язык типизирован статически.

Так что осталось от динамических языков, таких как Ruby, где существование метода проверяется только во время выполнения (или во время вызова).

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

0 голосов
/ 29 августа 2010

в C # 4 у вас есть динамический объект, который вы можете добавить / изменить во время выполнения.

...