Текущий архив: 2002.03.28;
Скачать: CL | DM;
ВнизВопрос о распространнёности Delphi в мире. Найти похожие ветки
← →
vuk (2002-02-14 21:07) [40]to VuDZ:
При желании все это легко реализуется. Я серьезно.
Я понимаю, что с STL это сделать гораздо проще(за счет шаблонов), но не надо преподносить как истину невозможность сделать это средствами OP и без шаблонов. :o)
P.S. У шаблонов, к стати говоря, не только плюсы имеются.
← →
VuDZ (2002-02-14 21:18) [41]я понимаю. и умножение двух 128 битных чисел на 8 разрядном проце я делал когда очень надо было. но одно дело использовать то, что позволяет язык, его идеология, а другое дело изобретать велосипед.
← →
kaif (2002-02-14 21:36) [42]Продвинутость C/C++ в США определяется только тем, что Государственный Комитет по C/C++ это здание размером с ООН. Страх перед государством, завтрашним днем, а также государственная политика США, не желающего зависеть от совершенно частной компании Borland приводят к тому, что C++ столь распространен в США. Понятно, что компании, "осваивающие" денежки государственных заказов вынуждены писать на С++. Напротив, независимые компании, средний и мелкий бизнес (а они как в США, так и в России создают около 90% рабочих мест) часто предпочитают работать на Delphi и рейтинги показывают, что продукты Borland (Delphi, C++ Builder и Java Builder) - самые покупаемые в мире.
Мало кто знает, что InterBase был принят военным ведомством США как основная и наиболее оптимальная СУБД по параметрам надежности, цены и качества. Хотя тут на форуме с трудом найдешь человека, который бы считал InterBase за "серьезный" продукт. Просто народ в России о себе много воображает, а серьезных программ не пишет. И думает, что если бы на C++ работал, то писал бы...
Если кто считает 1с за серьезную систему, то он просто с ней в жизни не сталкивался, значит. Один их интерпретатор, делающий 100тыс жалких циклов на моём компьютере в 650MHz чего стоит! А если считать критерием засилие продукта, то Visual Basic и MP3 player-ы - самый серьезный продукт на Земле!
← →
vuk (2002-02-14 21:36) [43]>одно дело использовать то, что позволяет язык, его идеология, а
>другое дело изобретать велосипед.
Позвольте, если я на OP напишу класс все это дело реализующий, ну или не это, а там всякие коллекции-итераторы, то это будет средством для данного языка неестественным? Ерунда какая-то у Вас получается... Или Вы считаете, что эти вещи естественны только тогда, когда реализованы при помощи шаблонов?
У разных языковых средств разные подходы к решению схожих проблем и что в одном случае будет неестественным, в другом будет делаться легко и непринужденно. Хотите пример?
function CreateForm( ClassRef : TFormClass ) : TForm;
begin
Result := ClassRef.Create(Application);
end;
Смысл, надеюсь, понятен? Если нет, то поясню, что функция создает экземпляр класса, который ей передается в качестве параметра.
Сколько у Вас займет построение того же самого (по смыслу) на C++?
← →
Suntechnic (2002-02-14 21:53) [44]>kaif © (14.02.02 21:36)
Вот тот, первый абзац твоего выступления, это была выдержка из доклада Лернида Ильича Брежнева XXIV съезду КПСС? Копирайт бы хоть поставил :)
← →
VuDZ (2002-02-14 21:53) [45]sorry, я наверно в конец отупел к концу дня, так как не понял смысл этого примера... поясните, плиз
← →
wicked (2002-02-14 22:02) [46]2 VuDZ ©
смысл простой.... тебе передаётся ссылка на класс формы, по которой создаётся форма.... если абстрагироваться, то всё просто.... а если представить, как это переведётся в код - жуть берёт..... :))
← →
VuDZ (2002-02-14 22:03) [47]Вы это имели в виду:
class A
{
public :
A(int _i) {
i = _i;
};
~A(){
};
int i;
};
template <class T>
void func (T *&tt)
{
tt = new T(0xff);
}
void main()
{
A *a = NULL;
func(a);
}
← →
VuDZ (2002-02-14 22:04) [48]PS а почему не сохраняется форматирование кода?
← →
wicked (2002-02-14 22:05) [49]2 VuDZ ©
похоже.... но я не играю в language wars.... я вырос на pascal... так что он для меня почти родной язык... а всё остальное можно написать на ассемблере.... :)
← →
VuDZ (2002-02-14 22:07) [50]слушай, объясни человеческим языком что делал тот кусок кода.
вызывает конструктор некоторого (или любого?) класса? или как...
← →
vuk (2002-02-14 22:07) [51]Попробую... Мы хотим создать экземпляр класса, но какого конкретно, на момент компиляции мы не знаем - это определяется только в момент выполнения.
В C++ необходимо будет реализовывать фабрики классов, каждая из которых может создавать объекты определенного класса. Далее, я думаю, Вам должно быть понятно.
В Object Pascal это делается иначе, поскольку есть такая вещь, как ссылки на класс (метаклассы). Если есть ссылка на класс, можно свободно вызывать через нее методы класса и конструкторы. Вызов нужного конструктора обеспечивается за счет механизма виртуальных конструкторов. Кстати, на основе этого механизма вся VCL построена.
Как кто-то однажды сказал, в OP "любой класс сам себе фабрика", но это не совсем точно, поскольку возможности несколько шире.
← →
wicked (2002-02-14 22:10) [52]vuk ©
браво.... вот что значит трезвая голова против пьяной....
← →
VuDZ (2002-02-14 22:18) [53]мда, пива было много, но вроде я что-то понял (чуть больше эпсилона :> )
так а чем приведённый мной код не устраивает условию?
> Если есть ссылка на класс, можно свободно вызывать через
> нее методы класса и конструкторы. Вызов нужного конструктора
> обеспечивается за счет механизма виртуальных конструкторов.
и чем это отличается от С++ ?
← →
Suntechnic (2002-02-14 22:21) [54]>vuk © (14.02.02 22:07)
Всё правильно ты заметил про фабрики классов в С++, которые реализуют точно такой же механизм как ты описал в своём примере. В С++ понятие виртуальный конструктор отсутствует, но всё это запросто реализуется с использованием фабик классов(их именно и имеют ввиду когда говорят о виртуальных конструкорах в С++). Разница принципиальная лишь в том, что в Object Pascal за тебя это уже кто-то написал, а в С++ ты сам волен это сделать. Этот флейм (С++ vs. Object Pascal) стар как мир и ничего нового вы тут не придумаете, так что советовал бы вам на этом и закончить.
...я всегда говорил и опять повторяю, главное это башка на плечах, а используемый язык это дело вкуса...написать можно всё что угодно и на чём угодно
...
← →
vuk (2002-02-14 22:23) [55]to VuDZ:
>так а чем приведённый мной код не устраивает условию?
Класс на момент компиляции известен.
← →
wicked (2002-02-14 22:24) [56]2 Suntechnic ©
> ....используемый язык это дело вкуса... написать можно всё что
> угодно и на чём угодно...
полностью поддерживаю..... руками и ногами... :) тем более, что и pascal не стоит на месте....
← →
VuDZ (2002-02-14 22:24) [57]Так-с... я пшёл перечитывать классику, а то что-то я торможу
всех с наступившим и приятного вечера :>
← →
vuk (2002-02-14 22:30) [58]to Suntechnic:
>Разница принципиальная лишь в том, что в Object Pascal за тебя
>это уже кто-то написал, а в С++ ты сам волен это сделать.
Разница принципиальная только в том, что это разные языки. А механизм ссылок на класс не имеет ничего общего с фабриками классов. Даже сходства нет. Просто это пример задачи которая решается в разных языках разными способами. О чем и шла речь. И никакого флейма. :o)
>...я всегда говорил и опять повторяю, главное это башка на
>плечах, а используемый язык это дело вкуса... написать можно
>всё что угодно и на чём угодно...
Вот под этим готов подписаться! :o)
← →
Suntechnic (2002-02-14 22:41) [59]>vuk © (14.02.02 22:30)
Ну ты нудный :)
>А механизм ссылок на класс не имеет ничего общего с фабриками классов.
М-да... общего нет ничего, но задачи решают одинаковые... Так может всё-таки есть что-то общее или какое-то сходство?(ну исключая реализацию конечно) :)))
А вот в языках то как раз принципиальной разницы и нет. Они все до горя друг на дружку похожи, иначе не предназначались бы для одной и той же цели.
← →
Vuk (2002-02-14 22:49) [60]>Так может всё-таки есть что-то общее или какое-то сходство?
Ага. Решаемая в данном случае задача. ;o) Но это к языку не относится.
>А вот в языках то как раз принципиальной разницы и нет.
Я имею в виду то, что это просто разные языки с разными языковыми средствами. Что-то есть в одном, что-то есть в другом. Не более того.
← →
Suntechnic (2002-02-14 22:57) [61]>Vuk © (14.02.02 22:49)
Ну а я тебе о чём? :)
← →
copyr25 (2002-02-14 23:04) [62]Во Fellomena, заварила кашу:))
← →
Oleg Gashev (2002-02-14 23:05) [63]Какая разница на чем писать? Главное, чтоб руки из мозгов росли:))
А мне на Delphi удобнее.
Chess Software Development Project: http://EcwChess.narod.ru
← →
VuDZ (2002-02-14 23:10) [64]а мне на асме... приятней и понятней... и ни каких классов...
← →
False_Delirium (2002-02-15 02:11) [65]Глава Sun Microsystems после поездки в Москву на пресс-коференции заявил : "Русские программисты в алгоритмизации оставили далеко позади все остальные страны. В то время как для повышения производительности мы улучшали вычислительные ресурсы(благо еть такая возможность), они разрабатывали новые алгоритмы."
← →
VuDZ (2002-02-15 03:38) [66]продолжаем-с флейм:
class CBase
{
public:
virtual void Init(int n) = 0;
virtual ~CBase(){};
};
class CA : public CBase
{
void Init(int n)
{
printf("Class A - %i\n", n);
}
virtual ~CA(){};
};
class CB : public CBase{
void Init(int n)
{
printf("Class B - %i\n", n);
}
virtual ~CB(){};
};
CBase* create(void)
{
switch(rand()%2)
{
case 0: return new CA();
case 1: return new CB();
}
return NULL;
}
void Do(void){
CBase *ptr = create();
ptr->Init(rand());
}
void main()
{
Do();
Do();
Do();
Do();
Do();
Do();
Do();
getch();
}
для более сложных вариантов надо использовать нечто вроде CRuntimeClass, IsKindOf()
← →
Andrey (2002-02-15 11:38) [67]Хотя переичсление "Серьезных программ" на Delphi вроде закончилось, мне хотелось бы вспомнить еще один проэкт
ЛИГА:ЗАКОН http://www.liga.kiev.ua/about/
написаный на Delphi
Приведу небольшую цитату:
"Сегодня системы ЛИГА:ЗАКОН успешно используют в Администрации Президента Украины, в Кабинете Министров Украины, в Национальном Банке Украины, в Государственной налоговой администрации, в различных министерствах и других органах исполнительной государственной власти и местного самоуправления Украины. Среди наших абонентов - многие иностранные представительства, посольства, многочисленные коммерческие структуры."
Организация в которой я работаю тоже пользуется Лигой. Мне только один раз удалось "свалить" Лигу и то только тогда когда я задался целью это сделать.
← →
VuDZ (2002-02-15 11:57) [68]ну, то на сколько легко завалить софт есть показатель привизны/прямоты рук программёров,а не языка...
← →
Andrews (2002-02-15 12:00) [69]> All
Не забывайте что отечественные пользователи и программисты всегда используют самые лучшие и новейшие версии программных продуктов, потому что они не платят за них деньги, на тех. поддержку им по большому счету наплевать и единственным критерием выбора остается качество и удобство работы (+ crack). Так что если Delphi попадет в число "этих" продуктов это говорит о многом...
← →
vuk (2002-02-15 15:14) [70]to VuDZ:
Это Вы к чему? :-/ В Вашем примере случайным образом создается либо экземпляр CA либо экземпляр CB. То есть все варианты создаваемых классов на момент компиляции, опять-таки, будут известны.
← →
VuDZ (2002-02-15 16:17) [71]кхм. то есть Вы хотите вызывать неизвестный конструктор неизвестного класса, описание которого нигде нету - то есть невозможно создать _любой_ класс. Просто потому, что неизвестно
какой конструктор вызывать - объект может иметь их несколько, и вообще неизвестно какие аргументы у этого конструктора.
По конкретнее если можно, а мы обмозгуем-с :>
← →
Юрий Зотов (M) (2002-02-15 17:11) [72]VuDZ © (15.02.02 16:17)
Все дело в ссылках на класс (метаклассах). Не на экземпляр класса, а на сам класс. Действительно мощная штука.
В примере vuk"а это параметр ClassRef. Вы передаете функции ссылку на любой класс, экземпляр которого Вы хотите создать, она вызывает конструктор именно этого класса и возвращает ссылку уже на экземпляр этого класса.
В более общем виде можно написать даже так:
function CreateAnyComponent
(AClass: TComponentClass; AOwner: TComponent): TComponent;
begin
Result := AClass.Create(AOwner)
end;
И пример использования:
EditForm := CreateAnyComponent(TForm, Application);
StringEditor := CreateAnyComponent(TEdit, EditForm);
TextEditor := CreateAnyComponent(TMemo, EditForm);
← →
vuk (2002-02-15 17:32) [73]to VuDZ:
>то есть Вы хотите вызывать неизвестный конструктор неизвестного
>класса
Почти. Имеется в виду возможность вызова конкретного конструктора неизвестного класса. В Object Pascal есть виртуальные конструкторы (а также виртуальные метода класса). У них, как и у виртуальных методов экземпляра, при введении формируются ограничения на состав параметров.
Например, у TComponent есть такой виртуальный конструктор:
constructor Create( AOwner : TComponent ); virtual;
Классы-потомки перекрывают этот виртуальный конструктор для обеспечения своего правильного конструирования. И вот как раз такой конструктор и взывается. Наличие его гарантируется тем, как объявляется ссылка на класс и признаком виртуальности.
Поэтому, если ссылка на класс, определена так:
TComponentClass = class of TComponent;
то можно быть уверенным, что имея такую ссылку, можем вызывать вышеописанный конструктор.
Концептуально ссылки на класс можно считать метаклассами, то есть такими специальными классами, экземплярами которых являются обычные классы. В вышеописанном примере экземплярами метакласса TComponentClass можно считать TComponent и всех его наследников.
← →
VuDZ (2002-02-15 18:09) [74]спасибо за объяснение.
я думаю ещё повоюем-с :>
(война - это единственное развлечение королей. доступное простым людям :> )
всего хорошего
← →
vuk (2002-02-15 18:12) [75]to VuDZ:
Какая ж это война-то? Мне казалось просто пообщались и все...
← →
VuDZ (2002-02-15 18:14) [76]ну да :)
PS война в хорошм смысле слова :), что бы выяснить некоторые моменты и пр.
← →
iZEN (2002-02-16 11:10) [77]/** vuk © (14.02.02 22:07):
<...>Мы хотим создать экземпляр класса, но какого конкретно, на момент компиляции мы не знаем - это определяется только в момент выполнения.<...>
В Object Pascal это делается иначе, поскольку есть такая вещь, как ссылки на класс (метаклассы). Если есть ссылка на класс, можно свободно вызывать через нее методы класса и конструкторы. Вызов нужного конструктора обеспечивается за счет механизма виртуальных конструкторов.<...>
Как кто-то однажды сказал, в OP "любой класс сам себе фабрика", но это не совсем точно, поскольку возможности несколько шире.
*/
Я могу дополнить: "в OP "любой класс сам себе фабрика" только на этапе компиляции и последующего исполнению -- потом это уже не имеет значения, поскольку приложение откомпилировано, скомпоновано и "заморожено" в EXE-файл(использование для этого DLL требует разработки собственного "уникального" механизма Plug-in или же "Добро пожаловать в COM").
Полная динамическая линковка (подгрузка новых классов в работающую программу, создание объектов-экземпляров новых классов и исполнение их кода) возможна в Java -- это, как правило, происходит в любой программе, написанной на ней -- программа начинает выполняться ещё до полной загрузки всех составляющих её классов :).
Например, можно воспользоваться механизмом явной загрузки класса и активации.
Пусть у нас имеется интерфейс:
public interface Figure {
public void draw(Canvas cnv);
}
Java-разработчику влом создавать классы фигур(точка, линия, окружность, овал, прямоугольник, полигон), реализующие интерфейс Figure. Поэтому он выпустил приложение БЕЗ графической библиотеки.
Что ж, если мне известен интерфейс Figure, то я могу без труда реализовать его для любой своей фигуры, а в программе указать её class-файл с кодом.
public class Circle implements Figure {
...
draw(Canvas cnv) {
cnv.drawOval(...);
}
...
}
А вот отрывок кода программы того программиста:
/** Редактор */
public class GraphEditor {
/*
* Метод, где в принципе неизвестен тип реальной фигуры
* на этапе компиляции
*/
private void paint(Figure f) {
f.draw(this.getCanvas());
}
/* "Точка входа" в приложение */
public static void main(String[] args) {
Editor ed = new Editor(..);
// Типичное использование авторских фигур:
//Oval ov = new Oval(..);
//Square sq = new Square(..);
//ed.paint(ov);//Вывод Овала
//ed.paint(sq);//Вывод Квадрата
/* Внимание! Динамическая загрузка класса и выполнение кода. */
try {
/*
* Загружаем любой новый класс,
* имя которого указано в параметрах командной строки.
* Например: args[0] содержит "mypackage.Circle"
*/
Class c = Class.forName(args[0]);
/*
* Создаём экземпляр класса...
*/
Object o = c.newInstance();
/*
* Нисходящее приведение типа к интерфейсу Figure...
*/
Figure etc = (Figure)o;
/*
* Рисуем фигуру...
*/
ed.paint(etc);//Вывод фигуры без перекомпиляции!!!
catch(Exception noex) {//Не обрабатываем для простоты
}
}
}
Я привёл только "вершину айсберга". В Java есть развитый Reflection API, методы которого могут "вытрясти" всю подноготную любого класса(представленного без исходника) и дать возможность "попользоваться" им по полной программе БЕЗ ПЕРЕКОМПИЛЯЦИЙ приложения.
Попробовали бы Вы проделать то же самое в приложении на ObjectPascal -- придётся свою Delphi писать...
← →
Nemesis (2002-02-16 13:02) [78]>iZEN (16.02.02 11:10)
А это правда, что в Microsoft отказались от поддержки Java в XP?
← →
iZEN (2002-02-16 13:39) [79]Да, правда!
Последняя MS JVM -- это урезаный аналог версии SunJRE1.1.4, использовалась до Windows 2000 включительно.
Так как сейчас на дворе уже не 1997 год, то использование Java1 не имеет большого значения даже в IE (из-за скудного набора API Java1 и низкого быстродействия). То есть MS давно отказалась от продвижения Java, а Java2 JVM они так и не выпустили.
Они[MS] её[Java] позиционируют в .Net как новый J++, легко переводящийся в C#, со всеми вытекающими отсюда ограничениями среды .Net и Java1.
А на сайте java.sun.com можно загрузить JRE последней версии под WindowsXP, ссылка: http://java.sun.com/getjava/download.html. Я пока не пробовал устанавливать JRE1.4 под WinXP, но версия JRE1.3.1 работает на ура (работают Java1/Java2-апплеты в IE6 и приложения в JAR-Executable запускаются из Проводника как EXE)..
Вот ещё цитаты :), Compulenta.ru:
1. "Компания Microsoft объявила о выходе бета-версии Java Language Conversion Assistant, программы для преобразования Java-кода в код C# для использования его на платформе .NET. Продукт полностью автоматизирован, интегрируется в Visual Studio .NET, следовательно, наследует все возможности этой среды разработки."
2. "Компания Halcyon Software ( http://www.halcyonsoft.com) объявила о выходе бета-версии iNET - первой коммерческой реализации технологии .Net на языке Java. В iNET входит утилита IL2JAVA, которая конвертирует программы из байт-кода (IL) .Net в байт-код Java, а также полную библиотеку классов .Net. "Разрабатываете под .Net, внедряете повсюду", - перефразировал слоган Java глава Halcyon Дон Си"
← →
Nemesis (2002-02-16 14:08) [80]Вот так они (MS) борятся с тими, кто им неподвласны ...
Это и есть продвижение на рынок своих продуктов за счет чужих (Java). И где тут честный бизнес!
Страницы: 1 2 3 вся ветка
Текущий архив: 2002.03.28;
Скачать: CL | DM;
Память: 0.64 MB
Время: 0.009 c