Qwertiy писал(а):На .NET тоже можно создавать COM-классы. На Си++ можно. Кажется Qt имеет какую-то систему взаимодействия с COM - точно не знаю.
Ты не поверишь, но и на ассемблере можно. А особо упоротые (намекаю на себя) могут меняя циферки в хекс-редакторе тоже сделать COM-класс. Только речь не о том, что что-то осуществимо. Да, на Си++ осуществимо. И на си без плюсов осуществимо. И на .net.
Но это не граждане первого класса в этих языках. И реализация на С++ заставить тебя плакать кровавыми слезами.
Вот, знаешь же, что такое «языковая панель»? Или «панель быстрого запуска»? Или вот в проводнике бывают панели (там где меню, адресная строка). Написать на VB6 такой extension для проводника/IE — дело пять минут. Подключил TLB-шку, реализовал несколько методов, скомпилировал, зарегистрировал — готово.
А теперь попробуй реализовать панельку на С++. У тебя полтыщи строк уйдёт только на супплементарные вещи, без какой-либо логики.
Qwertiy писал(а):32-битные программы можно изменять во время отладки на всех языках, достыпных в VS.
В таких широких пределах, в каких это позволяет VB6 — ничего нового из новых VS не предоставляет. Это же надо круто перекомпилировать программу на ходу, что является нетривиальной задачей.
Хороший показатель — immediate pane. Где-нибудь в новых C#/VB.NET есть? Нет, и быть не может. Это-ж надо компилировать программу. А в VB/VBA это возможно, потому что весь код уже практически предскомпилирован, а при попытке вызвать что-то, нужная часть будет скомпилирована (и потом остальной код будет дальше компилироваться on-demand). Можно вызвать отдельно взятую процедуру и проверить её работу. Единожды скомпилировавшись до конца, эта процедура даже будет жить внутри IDE в полностью скомпилированном виде, пока её модифицируют. Можно всю IDE использовать даже не для создания программ, а как некую командную строку для каких-то своих работ с командами-процедурами. Я так часто делаю.
Можно запускать программу, часть кода которой не дописано или содержит ошибки. Если выполнение не дойдёт до этих мест, остальная часть успешно отработает. Кто ещё так умеет?
Qwertiy писал(а):Сделать можно всё. Особенно ты можешь сделать всё. Но я говорю именно о стандартных возможностях, а не о варианте, когда надо сначала ооочень постараться, чтобы что-то получить, а потом этим пользоваться.
Не-не-не-не. Я не говорю тут про сорта моей личной «особой магии», с помощью которой я делаю разные штуки. Я говорю с позиции разработчиков VB6, у которых есть исходный код. Вот там везде LPTSTR, например, в коде, который макрос, который раскрывается либо в LPSTR либо в LPWSTR, в зависимости от другого макроса. Поменяли — и у нас все строки LPWSTR. И API-функции вызываются в W-шных воплощениях. И конвертация отвалилась (нормальные программисты обернули бы её в
#ifdef-ы). Точно так же
при наличии исходников легко дать возможность создавать новый VB-поток. Это мой кирпич супер-сложен, потому что он ищет в рантайме неэкспортируемые функции и структуруы, и вообще рассчитан на поддержку всех версий рантайма (включая VB5), и даже работу процесса в состоянии, когда в АП подгружено сразу куча разных версий рантаймов (за счёт SxS или трюка с переименованием DLL). А имея исходники — раз плюнуть.
Qwertiy писал(а):Ну и не понятно, как я указатели на функции (ну или делегаты) забыл - их тоже нет.
Да потому что это зло в рамках идеологии, которой придерживались создатели.
Если вам нужно вызывать какой-то код, но вы не определились — какой, и у вас много таких кусков кода и вы определитесь только на этапе выполнения, то правильный подход в этом случае: создать интерфейс, который будет олицетворять куски кода, у этого интерфейса сделать метод, который будет служить точкой входа в этот код, а потом на этапе выполнения брать один из объектов и дёргать у него этот метод.
Иными словами, в рамках ООП вам никогда не нужен указатель на функцию: вы и в этом случае должны оперировать указателя на объекты. Просто оборачиваете вашу функцию в объект, а у вас уже не указатель на функцию, а ссылка на объект, как обычно. Это каноническое идеологически правильное решение в рамках этой идеологии. И оно работает. А для обратной совместимости с идеологически-неверной кодовой базой они сделали AddressOf.
Я делаю здесь выводов или оценок, насколько это хорошо или плохо. Но я говорю, что есть идеология, и они её соблюдали при проектировании, и хотели, чтобы мы соблюдали при написании кода. Идеология работает в рамках своей применимости. Кстати, давно хочу написать топик насчёт функций-объектов.
Qwertiy писал(а):Эм.. Что-то я не слышал, чтобы их на VB6 писали. Си и Си++ же, не?
Да какая разница? В VB есть классы, но нет классического наследования. В Си нет классов вообще и наследования тем более.
Тем не менее, на Си успешно пишут драйверы с использованием упомянутого паттерна проектирования. Что я призываю делать и в VB. Всё ядро Windows написано на Си, и тем не менее, оно объектно-основанное. И в Linux с ядром та же история.
Приведу цитату из одного Линуксовского манифеста:
http://www.tux.org/lkml/#s15-3 писал(а):- Should the kernel use object-oriented programming techniques? Actually, it already does. The VFS (Virtual Filesystem Switch) is a prime example of object-oriented programming techniques. There are objects with public and private data, methods and inheritance. This just happens to be written in C. Another example of object-oriented programming is Xt (the X Intrinsics Toolkit), also written in C. What's important about object-oriented programming is the techniques, not the languages used.
Думаю понятно и без перевода.