Здравствуйте, ·, Вы писали:
·>Так в данном случае это отличие динамической типизации и статической, а не особенности ООПшнсти. Во всяких Java вызов неизвестного метода просто не может произойти, т.к. такой код даже невалиден с т.з. компилятора.
ООПшность динамична по определению: только объект, в общем случае, знает какие сообщения он может обработать и как, а не компилятор. Объект может находится в другом процессе, на другой машине. Во всяких Java через рефлексию можно попробовать вызывать любой метод у любого объекта. Во всяком случае можно было раньше. На этом строятся mock-фреймворки, AFAIK, и AOP-фреймворки (Aspect-Oriented Programming).
·>А можно развернуть плз?
·>Как по мне, вызов метода — это частный случай отправки сообщения: синхронно, с получением результата, ровно одному получателю.
Сообщение -- это тоже объект, с ним можно делать всё то, что и с другими объектами, до, после, во время обработки. Методы -- это реакции на сообщения, практически просто вызов процедуры по указателю из VMT. Метод "принадлежит" объекту (классу, интерфейсу), сообщение -- нет, оно само по себе. Можно сохранить (в переменную) ссылку на метод (с объектом или без), но не параметры, либо сохранить замыкание с телом-вызовом метода.
obj.Foo(x, y);
var objFooRef = obj.Foo;
objFooRef(x, y);
var fooRef = TheObj.Foo;
fooRef(obj, x, y);
var fooCall = fun (obj: TheObj) -> obj.Foo(x, y);
fooCall(obj);
--
obj.Dispatch(new Foo{x, y});
var foo = new Foo{x, y};
obj.Dispatch(foo);