![]() |
#1 |
Участник
|
![]()
в С++ есть такая замечательная вещь как позднее связывание т.е.
virtual функции. Которые можно использовать примерно так: ////есть класс ///////////////////////////////////////// class obj { object() {}; ~object() {}; virtual int intersect( int , int )=0; }; //////////////////////////////////////// ///есть дочерние классы class ADD ![]() { /// + свои private переменные и методы public: virtual int intersect(int , int); }; int ADD::intersect(int A, int B) { return A+B; } //// и еще один class SUB ![]() { /// + свои private переменные и методы public: virtual int intersect(int , int); }; int SUB::intersect(int A, int B) { return A-B; } //// что мы имеем void func(void) { obj *work[2]; ADD *A; SUB *B; A =new ADD; //создадим B=new SUB; // объекты work[0]=A; // присвоим из в массив work[1]=B; // printf("%d",work[0]->intersect(7,5)); // получаем 12 т.к. вызван метод класса ADD printf("%d",work[1]->intersect(7,5)); // получаем 2 т.к. вызван метод класса SUB } ////////////////////////////////////////// как такие вещи реализуются в Axapta ??? |
|
![]() |
#2 |
----------------
|
Смотрим FormLetter
Обычно так:
В предке создается метод (см. FormLetter) PHP код:
(см. SalesFormLetter_PackingSlip, PurchFormLetter_PackingSlip и т.д. и т.п.) |
|
![]() |
#3 |
Участник
|
тогда вопрос такой..
В С++ Класс - это класс, а экземпляр класса - объект и я могу объявить массив объектов или массив ссылок на объекты... class ABC { } func() { ABC array[10]; ABC *relat; ABC *relat_array[10]; } а в Х++ так нельзя что-ли? В документации я не нашел такого |
|
![]() |
#4 |
----------------
|
указатель
В X++ нет указателей
|
|
![]() |
#5 |
Участник
|
А массив экземпляров классов я могу определить???
/////////////////////// class ABC { } /////////////////////// func() { ABC array[10]; } /////////////////////// как мне быть если мне надо массив экземпляров класса может мне надо 1000 объектов обработать 300 из которых перекрывают метод "таким образом" а еще 300 "другим" и еще 400 "разными способами" вот так у меня получилось через abstract class predmet { } static void test_oot() { predmet p; SUB A; ADD B; ; A = new SUB(); B = new ADD(); p=A; print p.DOIT(5,3); // результат 2 p=B; print p.DOIT(5,3); // результат 8 pause; } // а вот запихать вы все это дело в массив print p[1].DOIT(5,3); // результат 2 print p[2].DOIT(5,3); // результат 8 |
|
![]() |
#6 |
Участник
|
renat, X++ наследник Java, а не С++
Твои вопросы относятся скорее к Java, чем к Аксапте. Соответственно в документации по Аксапте эти вопросы не освещаются, а просто дается отсулка в той же Java. |
|
![]() |
#7 |
Участник
|
тогда вопрос к знатокам Java и X++
Можно ли создать массив экземпляров класса? abstract class ABC { } func() { ABC array[10]; } или что-то подобное |
|
![]() |
#8 |
Соучастник
|
В java Обьект являетя обьектом, и поэтому вызывается именно его метод..
т.е. можно сделать так: Цитата:
abstract class Parent {
void test(){} } class Sub1 extends Parent{ void test(){} } class Sub2 extends Parent{ void test(){} } ..... Parent[] arr; ... //можно так arr[i].test(); //а можно так if(arr[i] instanceof Sub1){/*Do something*/} else {/*Do something else*/} 2mazzy: говорить, что X++ наследник Java - ни о чем не говорить. Если и наследник, то наследие его черезвычайно мало. Скорее это самородок из той же рассы(или выродок - это кому как)..
__________________
View Anton Soldatov's LinkedIn profile |
|
![]() |
#9 |
----------------
|
массив объектов
Для хранения (использования) массивов объектов применяется специальный простенький класс Array
|
|
![]() |
#10 |
----------------
|
More
Еще можно посмотреть сюда:
http://technet.navision.com/default....put&NEWSID=108 |
|
![]() |
#11 |
Соучастник
|
Да про Array и в руководстве разработчика то же самое написано.. я просто не был уверен, что пройдет следующее:
Цитата:
Array arr = new Array(Types::Class);
Parent tmp; ; tmp = new Sub1(); arr.value(1, tmp); tmp = new Sub2(); arr.value(2, tmp); tmp = arr.value(1); tmp.test(); tmp = arr.value(2); tmp.test(); pause;
__________________
View Anton Soldatov's LinkedIn profile |
|
![]() |
#12 |
Участник
|
// наконец получилосьто что хотелось
// класс predmet abstract class predmet { } int DOIT(int a, int b) { return 0; } // класс ADD class ADD extends predmet { } int DOIT(int a, int b) { return a+b; } // класс SUB class SUB extends predmet { } int DOIT(int a, int b) { return a-b; } // static void test_oot() { array M; predmet p; SUB A; ADD B; ; M= new array(types::class); A = new SUB(); B = new ADD(); M.value(1,A); M.value(2,B); p=M.value(1); print p.DOIT(5,3); // 5-3=2 p=M.value(2); print p.DOIT(5,3); // 5+3=8 pause; } |
|
![]() |
#13 |
Участник
|
сам немного программирую на С++ и хочу сказать что есть _принципиальные_ отличия Х++ от языков с ООП.
например определения классов: насколько я понял, (в Х++) нельзя написать определение нового класса "в тексте", хотя бы потому, что нет как таковых текстов программы, есть АОТ и все должно храниться в нем. С одной стороны, это бывает удобно, а с другой - уменьшает степень свободы программиста. вообще я не совсем поинмаю саму идеологию языка: он слишком низкоуровневый для предметно-ориентированного (как язык 1С) и недостаточно универсален для программирования баз данных (как SQL). вот почему бы не сделать поддержку SQL на уровне стандарта, которому уже более 10 лет? |
|
![]() |
#14 |
Соучастник
|
![]() 1)что такое "языки с ООП"? 2)почему текст кода в AOT не текст? 3)кто Вам сказал что нет поддержки SQL? Цитата:
Connection Con = new Connection();
Statement Stmt = Con.createStatement(); ResultSet R = Stmt.executeQuery('SELECT VALUE FROM SQLSYSTEMVARIABLES'); while ( R.next() ) { print R.getString(1); }
__________________
View Anton Soldatov's LinkedIn profile |
|
![]() |
#15 |
Участник
|
объясняю:
1) любой язык программирования в котором реализован объектно-ориентированный подход к программрованию. четкое определение не могу дать, но для примера: С++ объектно-ориентированный, VB - нет. 2) опять-таки с С++ я могу написать код в отдельном файле и добавить этот файл в проект. и в одном таком файле я могу создать любое количество классов, как выведенных, так и новых. есть такая возможность в аксапте? 3) да, в 1С тоже есть такая "поддержка", правда, внешними компонентами. это не суть. я говорю о конструкциях select и delete которые "SQL-подобны", однако не поддерживают даже функции в запросе (кроме агрегатных), не говоря уж о вложенных запросах, что является основой SQL (вспомните - structured query language однако) |
|
![]() |
#16 |
Соучастник
|
Цитата:
Изначально опубликовано Uncle Fedor
объясняю: 1) любой язык программирования в котором реализован объектно-ориентированный подход к программрованию. четкое определение не могу дать, но для примера: С++ объектно-ориентированный, VB - нет. 2) опять-таки с С++ я могу написать код в отдельном файле и добавить этот файл в проект. и в одном таком файле я могу создать любое количество классов, как выведенных, так и новых. есть такая возможность в аксапте? 3) да, в 1С тоже есть такая "поддержка", правда, внешними компонентами. это не суть. я говорю о конструкциях select и delete которые "SQL-подобны", однако не поддерживают даже функции в запросе (кроме агрегатных), не говоря уж о вложенных запросах, что является основой SQL (вспомните - structured query language однако) 2) что есть файл? - это всего лишь условность. некая сущность, объединяющая данные.. и есть текстовые редакторы, которые умеют содержимое файлов отображать в виде простого листинга.. В Аксапте Вы можете создавать классы, как и сколько вам угодно.. только в одном окне будет отображаться один класс.. это всего-лишь свойства редактора АОТ, а не концепция ООП. я считаю это плюсом(защитой от любителей усложнять), а не недостатком.. всем не угодишь.. 3)no comments.. прежде чем утверждать - проверьте.
__________________
View Anton Soldatov's LinkedIn profile |
|
![]() |
#17 |
Участник
|
насчет 2) возможно ты прав. просто дело привычки. но это лишь одна из тех условностей, что навязывает среда разработки. вот если я хочу в нотепаде написать несколько функций в 3 строки каждая (ну просто чтобы видеть их рядом) и вставить их одинм махом, я могу это сделать?
насчет 3) мы недопоняли друг друга. я прекрасно понял что есть замечательный объект Connection и с ним я могу общаться как угодно. а мне было бы удобно писать текст запроса в тексте модуля, а не в строке, передаваемой объекту. понимаете разницу? к тому же есть большое отличие в псевдо-запросах Х++ и реальных SQL запросах. в частности, использование переменных типа таблица. в SQL обращение к таблице производится по идентификатору, без определения переменных. я даже догодываюсь, зачем так сделано - просто настоящие таблицы получили "оболочку" в виде объекта с тем же именем. но опять же этот объект получился очень "жестким", сохранив из свойств ООП только инкапсуляцию. разве не так? в целом приятно было пообщаться, пойду поработаю немного ![]() всем спасибо. |
|
![]() |
#18 |
Участник
|
to Uncle Fedor:
Среда разработки конечно накладывает свою специфику, но X++ от этого не становится менее объектно-ориентированным. Да, на объекты таблиц и форм накладываются определенные ограничения. Встроенный SQL конечно убогий, но это лучше чем ничего. Одна из возможных причин этого универсальность обращения к БД (MS SQL, Oracle). Сложные отчеты можно строить и внешними средствами (тот же самый Crystal) и используя желаемый диалект SQL со всеми фитчами. Благо имеется поддержка COM и WinAPI. |
|
![]() |
#19 |
Участник
|
Цитата:
Изначально опубликовано Антон Солдатов
2mazzy: говорить, что X++ наследник Java - ни о чем не говорить. Если и наследник, то наследие его черезвычайно мало. Скорее это самородок из той же рассы(или выродок - это кому как).. ![]() Это уже религиозные войны ![]() В них не бывает победителя. |
|
![]() |
#20 |
NavAx
|
![]()
с тех пор как перешел с java и с++ на X++, ко многим вещам, которые по началу раздражали привык, но вот то, к чему я никогда, наверное, не привыкну:
- нет перегрузки операторов, приходится использовать switch - нет возможности группировать код по пакетам и зонам видимости - системная часть кода закрыта, это хорошо, но на нее отсутствует описание интерфейса!!! |
|