Сообщение Re[7]: Недоучки по настоящему ООП не освоили (из-за Basic и от 02.09.2025 10:02
Изменено 02.09.2025 10:03 ·
Re[7]: Недоучки по настоящему ООП не освоили (из-за Basic и
Здравствуйте, korvin_, Вы писали:
_>·>Так в данном случае это отличие динамической типизации и статической, а не особенности ООПшнсти. Во всяких Java вызов неизвестного метода просто не может произойти, т.к. такой код даже невалиден с т.з. компилятора.
_>ООПшность динамична по определению: только объект, в общем случае, знает какие сообщения он может обработать и как, а не компилятор.
Статическая типизация позволяет на этапе компиляции доказать, что объекту "посылаются сообщения" только те, которые он может обработать. Т.е. никакого "вызова неизвестного метода" просто быть не может.
_>Объект может находится в другом процессе, на другой машине. Во всяких Java через рефлексию можно попробовать вызывать любой метод у любого объекта. Во всяком случае можно было раньше. На этом строятся mock-фреймворки, AFAIK, и AOP-фреймворки (Aspect-Oriented Programming).
А рефлексия это уже реализация динамической типизации в рантайме, причём тут ООП? В каком-то смысле это просто до-компиляция кода уже после запуска.
Поэтому, в яп где нет рефлексии (в том же С++, например) — динамичности никакой нет, но отрицать наличие ООПшности в С++ у меня язык не повернётся.
_>·>А можно развернуть плз?
_>·>Как по мне, вызов метода — это частный случай отправки сообщения: синхронно, с получением результата, ровно одному получателю.
_>Сообщение -- это тоже объект, с ним можно делать всё то, что и с другими объектами, до, после, во время обработки. Методы -- это реакции на сообщения, практически просто вызов процедуры по указателю из VMT. Метод "принадлежит" объекту (классу, интерфейсу), сообщение -- нет, оно само по себе. Можно сохранить (в переменную) ссылку на метод (с объектом или без), но не параметры, либо сохранить замыкание с телом-вызовом метода.
Это вопрос интерпретации. Скажем, в Плюсах будет:
Обычный делегат.
В java тоже нет ссылок на метод. Есть лямбды, которые в каком-то смысле просто реализации интерфейса:
_>·>Так в данном случае это отличие динамической типизации и статической, а не особенности ООПшнсти. Во всяких Java вызов неизвестного метода просто не может произойти, т.к. такой код даже невалиден с т.з. компилятора.
_>ООПшность динамична по определению: только объект, в общем случае, знает какие сообщения он может обработать и как, а не компилятор.
Статическая типизация позволяет на этапе компиляции доказать, что объекту "посылаются сообщения" только те, которые он может обработать. Т.е. никакого "вызова неизвестного метода" просто быть не может.
_>Объект может находится в другом процессе, на другой машине. Во всяких Java через рефлексию можно попробовать вызывать любой метод у любого объекта. Во всяком случае можно было раньше. На этом строятся mock-фреймворки, AFAIK, и AOP-фреймворки (Aspect-Oriented Programming).
А рефлексия это уже реализация динамической типизации в рантайме, причём тут ООП? В каком-то смысле это просто до-компиляция кода уже после запуска.
Поэтому, в яп где нет рефлексии (в том же С++, например) — динамичности никакой нет, но отрицать наличие ООПшности в С++ у меня язык не повернётся.
_>·>А можно развернуть плз?
_>·>Как по мне, вызов метода — это частный случай отправки сообщения: синхронно, с получением результата, ровно одному получателю.
_>Сообщение -- это тоже объект, с ним можно делать всё то, что и с другими объектами, до, после, во время обработки. Методы -- это реакции на сообщения, практически просто вызов процедуры по указателю из VMT. Метод "принадлежит" объекту (классу, интерфейсу), сообщение -- нет, оно само по себе. Можно сохранить (в переменную) ссылку на метод (с объектом или без), но не параметры, либо сохранить замыкание с телом-вызовом метода.
Это вопрос интерпретации. Скажем, в Плюсах будет:
_>obj.Foo(x, y);
_>var objFooRef = obj.Foo;
//это объект типа std::function
_>objFooRef(x, y);
//Вызов метода с именем "operator()" и двумя арументами.Обычный делегат.
В java тоже нет ссылок на метод. Есть лямбды, которые в каком-то смысле просто реализации интерфейса:
var objFooRef = new Function() {
R apply(X x, Y y) {return obj.Foo(x, y);}
}
//и даже приходится явно писать имя метода при вызове:
objFooRef.apply(x, y);Re[7]: Недоучки по настоящему ООП не освоили (из-за Basic и
Здравствуйте, korvin_, Вы писали:
_>·>Так в данном случае это отличие динамической типизации и статической, а не особенности ООПшнсти. Во всяких Java вызов неизвестного метода просто не может произойти, т.к. такой код даже невалиден с т.з. компилятора.
_>ООПшность динамична по определению: только объект, в общем случае, знает какие сообщения он может обработать и как, а не компилятор.
Статическая типизация позволяет на этапе компиляции доказать, что объекту "посылаются сообщения" только те, которые он может обработать. Т.е. никакого "вызова неизвестного метода" просто быть не может.
_>Объект может находится в другом процессе, на другой машине. Во всяких Java через рефлексию можно попробовать вызывать любой метод у любого объекта. Во всяком случае можно было раньше. На этом строятся mock-фреймворки, AFAIK, и AOP-фреймворки (Aspect-Oriented Programming).
А рефлексия это уже реализация динамической типизации в рантайме, причём тут ООП? В каком-то смысле это просто до-компиляция кода уже после запуска.
Поэтому, в яп где нет рефлексии (в том же С++, например) — динамичности никакой нет, но отрицать наличие ООПшности в С++ у меня язык не повернётся.
_>·>А можно развернуть плз?
_>·>Как по мне, вызов метода — это частный случай отправки сообщения: синхронно, с получением результата, ровно одному получателю.
_>Сообщение -- это тоже объект, с ним можно делать всё то, что и с другими объектами, до, после, во время обработки. Методы -- это реакции на сообщения, практически просто вызов процедуры по указателю из VMT. Метод "принадлежит" объекту (классу, интерфейсу), сообщение -- нет, оно само по себе. Можно сохранить (в переменную) ссылку на метод (с объектом или без), но не параметры, либо сохранить замыкание с телом-вызовом метода.
Это вопрос интерпретации. Скажем, в Плюсах будет:
Обычный делегат.
В java тоже нет ссылок на метод. Есть лямбды, которые в каком-то смысле просто реализации интерфейса:
_>·>Так в данном случае это отличие динамической типизации и статической, а не особенности ООПшнсти. Во всяких Java вызов неизвестного метода просто не может произойти, т.к. такой код даже невалиден с т.з. компилятора.
_>ООПшность динамична по определению: только объект, в общем случае, знает какие сообщения он может обработать и как, а не компилятор.
Статическая типизация позволяет на этапе компиляции доказать, что объекту "посылаются сообщения" только те, которые он может обработать. Т.е. никакого "вызова неизвестного метода" просто быть не может.
_>Объект может находится в другом процессе, на другой машине. Во всяких Java через рефлексию можно попробовать вызывать любой метод у любого объекта. Во всяком случае можно было раньше. На этом строятся mock-фреймворки, AFAIK, и AOP-фреймворки (Aspect-Oriented Programming).
А рефлексия это уже реализация динамической типизации в рантайме, причём тут ООП? В каком-то смысле это просто до-компиляция кода уже после запуска.
Поэтому, в яп где нет рефлексии (в том же С++, например) — динамичности никакой нет, но отрицать наличие ООПшности в С++ у меня язык не повернётся.
_>·>А можно развернуть плз?
_>·>Как по мне, вызов метода — это частный случай отправки сообщения: синхронно, с получением результата, ровно одному получателю.
_>Сообщение -- это тоже объект, с ним можно делать всё то, что и с другими объектами, до, после, во время обработки. Методы -- это реакции на сообщения, практически просто вызов процедуры по указателю из VMT. Метод "принадлежит" объекту (классу, интерфейсу), сообщение -- нет, оно само по себе. Можно сохранить (в переменную) ссылку на метод (с объектом или без), но не параметры, либо сохранить замыкание с телом-вызовом метода.
Это вопрос интерпретации. Скажем, в Плюсах будет:
_>obj.Foo(x, y);
_>var objFooRef = obj.Foo;
//это объект типа std::function
_>objFooRef(x, y);
//Вызов метода с именем "operator()" с двумя арументами у объекта типа std::function.Обычный делегат.
В java тоже нет ссылок на метод. Есть лямбды, которые в каком-то смысле просто реализации интерфейса:
var objFooRef = new Function() {
R apply(X x, Y y) {return obj.Foo(x, y);}
}
//и даже приходится явно писать имя метода при вызове:
objFooRef.apply(x, y);