Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 313 314 [315] 316 317 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#4711
,
|
|
|
|
Можно вот так сделать утиную типизацию интерфейса, но только все методы делегируем ручками (можно автоматом посредством RTTI, но тогда лишаемся проверки в компил-тайме).
![]() ![]() type TSomeClass1 = class public procedure Foo; procedure Bar(const AValue: Integer); end; TSomeClass2 = class public procedure Foo; procedure Bar(const AValue: string); end; TSomeInterface = record public class var Foo: procedure of object; class var Bar: procedure(const AValue: Integer) of object; end; procedure TSomeClass1.Foo; begin Writeln('TSomeClass1.Foo'); end; procedure TSomeClass1.Bar(const AValue: Integer); begin Writeln(Format('TSomeClass1.Bar(%d)', [AValue])); end; procedure TSomeClass2.Bar(const AValue: string); begin end; procedure TSomeClass2.Foo; begin end; var SomeClass1: TSomeClass1; SomeClass2: TSomeClass2; SomeInterface: TSomeInterface; begin SomeClass1 := TSomeClass1.Create; SomeClass2 := TSomeClass2.Create; with SomeInterface do begin Foo := SomeClass1.Foo; Bar := SomeClass1.Bar; end; // а вот это не сработает // with SomeInterface do // begin // Foo := SomeClass2.Foo; // Bar := SomeClass2.Bar; //Incompatible types: 'Integer' and 'string' // end; SomeInterface.Foo; SomeInterface.Bar(42); Readln; end. ![]() ![]() TSomeClass1.Foo TSomeClass1.Bar(42) |
|
Сообщ.
#4712
,
|
|
|
|
Цитата scorpion @ Напомните плз, про мультиметоды, только в вики не посылайте плз, а то там непонятно както ![]() мультиметоды в отличие от обычных методов диспетчеризуются по всем своим аргументам, т.е. определении обычных методов ![]() ![]() void MyClass::myMethod (int x, int y) { // code 1 } void MyMegaClass::myMethod (int x, int y) { // code 2 } можно условно представить так: ![]() ![]() void myMethod (MyClass this, int x, int y) { // code 1 } void myMethod (MyMegaClass this, int x, int y) { // code 2 } где в зависимости от типа первого аргумента (this) определяется какой код будет выполняться. в мультиметодах же код выбирается по типам всех аргументов метода. например: ![]() ![]() void myMethod (MyClass x, MyClass y) { // code 1 } void myMethod (MyMegaClass x, MyClass y) { // code 2 } void myMethod (MyClass x, MyMegaClass y) { // code 3 } void myMethod (MyMegaClass x, MyMegaClass y) { // code 4 } это основное. в CLOS есть некоторые дополнительные фишки, типа определение порядка просмотра типов аргументов метода |
|
Сообщ.
#4713
,
|
|
|
|
Цитата korvin @ в мультиметодах же код выбирается по типам всех аргументов метода. например: |
|
Сообщ.
#4714
,
|
|
|
|
Цитата DesweR @ Я имею ввиду случаи, когда реализации интерфейсов скрываются либо в целях ограничения доступа извне, либо из-за удобства декомпозиции самого функционала. Цитата DesweR @ Но. И в любых других случаях, также нет смысла делать реализацию публичной, без какой-либо необходимости на то, т.к. клиенты всё равно работают через интерфейсы, а не через реализующие их объекты. Если мы реализуем какой-то интерфейс, то я не вижу смысла делать методы приватными - клиент всё равно имеет к ним доступ через интерфейс. |
|
Сообщ.
#4715
,
|
|
|
|
Цитата MyNameIsIgor @ Если мы реализуем какой-то интерфейс, то я не вижу смысла делать методы приватными - клиент всё равно имеет к ним доступ через интерфейс. Встречный вопрос, а зачем твоему клиенту интерфейс, если можно сразу пользоваться экземпляром класса? Это не отменяет главного: Цитата MyNameIsIgor @ когда реализации интерфейсов скрываются либо в целях ограничения доступа извне |
|
Сообщ.
#4716
,
|
|
|
|
Цитата DesweR @ Встречный вопрос, а зачем твоему клиенту интерфейс, если можно сразу пользоваться экземпляром класса? Это смотря какой клиент. Кто-то знает только о интерфейсе, кто-то может знать и о реализации. Цитата DesweR @ Это не отменяет главного: когда реализации интерфейсов скрываются либо в целях ограничения доступа извне Ещё раз: вы ничего не скрыли, через интерфейс всё равно всё торчит наружу. |
|
Сообщ.
#4717
,
|
|
|
|
Цитата Qraizer @ Вообще, хотелось в ним поболтать на кое-какие темы и родить нормальную библиотечную версию. Он даже не был против, но рутина затянула. Программа максимум - параметризировать количество параметров мультиметода. Ну, давай поболтаем. У меня как раз библиотекчка для таких дел подбирается. Там сейчас проперти, ленивые списки, надо бы и мультиметоды добавить. |
|
Сообщ.
#4718
,
|
|
|
|
Цитата MyNameIsIgor @ Ещё раз: вы ничего не скрыли, через интерфейс всё равно всё торчит наружу. Что там торчит - зависит от того, какой у меня интерфейс на руках (IGuest или IAdmin или ...). |
|
Сообщ.
#4719
,
|
|
|
|
Цитата DesweR @ Что там торчит - зависит от того, какой у меня интерфейс на руках (IGuest или IAdmin или ...). Тогда не понятно, что и от кого вы собрались скрывать, если говорите только о пользователях интерфейсов... |
|
Сообщ.
#4720
,
|
|
|
|
Цитата Qraizer @ Меньше, чем по вызову на параметр, боюсь, не получится даже в поддержкой на уровне языка. По-любому по VMT придётся восстанавливать тип каждого параметра отдельно, и где-то хранить n-размерную матрицу указателей на перекрытые методы, а это скорее всего ещё один вызов. Так что на этом примере получилось бы три вызова. Ты знаешь, сейчас взглянул в новый стандарт, в частности, вот на эту декларацию: ![]() ![]() namespace std { class type_info { public: virtual ~type_info() noexcept; bool operator==(const type_info& rhs) const noexcept; bool operator!=(const type_info& rhs) const noexcept; bool before(const type_info& rhs) const noexcept; size_t hash_code() const noexcept; const char* name() const; type_info(const type_info& rhs) = delete; // cannot be copied type_info& operator=(const type_info& rhs) = delete; // cannot be copied }; } И понял, что вполне можно сделать неинтрузивный мультиметод с произвольным числом параметров и константным временем поиска. Правда, получится хит по памяти (многомерная виртуальная таблица), но... |
|
Сообщ.
#4721
,
|
|
|
|
Цитата Flex Ferrum @ И понял, что вполне можно сделать неинтрузивный мультиметод с произвольным числом параметров и константным временем поиска. Правда, получится хит по памяти (многомерная виртуальная таблица), но... За подобную штуку, особенно в виде либы, был бы мегаблагодарен! |
|
Сообщ.
#4722
,
|
|
|
|
Цитата MyNameIsIgor @ За подобную штуку, особенно в виде либы, был бы мегаблагодарен! Ну, на самом деле, там не совсем константное время поиска получится. Потому что потребутеся преобразовывать хэш типа аргумента в индекс. За константное время это сделать нельзя. Кроме того, потребуется прилинкованный RTTI. И это если считать, что определение типа по указателю на полиморфный класс занимает время, близкое к константе. |
|
Сообщ.
#4723
,
|
|
|
|
Цитата MyNameIsIgor @ Тогда не понятно, что и от кого вы собрались скрывать, если говорите только о пользователях интерфейсов... О Господи, от чужих шаловливых ручек. |
|
Сообщ.
#4724
,
|
|
|
|
Цитата MyNameIsIgor @ Если мы реализуем какой-то интерфейс, то я не вижу смысла делать методы приватными - клиент всё равно имеет к ним доступ через интерфейс. я даже добавлю, мы не можем сделать методы, реализующие какой-то интерфейс, приватными, ведь интерфейс описывает какие публичные методы обязаны быть у его реализаций. какое при этом отношение спецификатор доступа имеет к сокрытию реализации, как будто мы можем увидеть исходный код паблик-метода и какие приватные поля он использует в объекте |
|
Сообщ.
#4725
,
|
|
|
|
Цитата korvin @ ведь интерфейс описывает какие публичные методы обязаны быть у его реализаций Это где написано? Интерфейс требует только реализации, а уж где и какой ему монописуально. Цитата korvin @ как будто мы можем увидеть исходный код паблик-метода и какие приватные поля он использует в объекте Мы можем заюзать недозволенный функционал. |