Информация об изменениях

Сообщение Re[90]: Java vs C# vs C++ от 11.10.2015 19:48

Изменено 11.10.2015 19:58 Serginio1

Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Serginio1, Вы писали:


_>>>Аааа, так оно ещё и через COM это делается... ) Тогда уж точно никакой разницы с другими языками нет, причём уже прямо сейчас. Т.е. банально реализуем соответствующий COM интерфейс и без проблем используем его в 1C. Не знаю правда зачем, но делается это тривиально. )))

S>> Тебе нужно делать обертку Idispatch над объектом, типом. В Net это делается через Reflection к любому типу, объекту
S>>Раз это элементарно забацайка. В той статье класс оборачивает любой объект, тип. Поддержка энумераторов.
S>>Давай прямо сейчас.
S>> Это еще раз подтверждение того, что ты невнимательно читаешь ссылки

S>>Что было понятно то основной метод такой обертки для вызова свойства метода реального объекта.


EP>Вот конкретный пример, правда там обвёртка к Python, а не IDispatch, но тем не менее:

EP>
EP>// наш класс:
EP>struct World
EP>{
EP>    void set(std::string msg) { this->msg = msg; }
EP>    std::string greet() { return msg; }
EP>    std::string msg;
EP>};
EP>// указываем те методы которых хотим экспортировать:
EP>BOOST_PYTHON_MODULE(hello)
EP>{
EP>    class_<World>("World")
EP>        .def("greet", &World::greet)
EP>        .def("set", &World::set)
EP>    ;
EP>}
EP>// можно сократить до вот такого варианта:
EP>PYTHON_MODULE_SIMPLIFIED
EP>(
EP>    hello,
EP>    World,
EP>    greet, set
EP>)
EP>
Использование:

EP>
>>>> import hello
>>>> planet = hello.World()
>>>> planet.set('howdy')
>>>> planet.greet()
EP>'howdy'
EP>

EP>Помимо этого есть автоматические генераторы клея между языками типа SWIG — там даже методы перечислять не нужно.
Ну вы совсем, что ли не читаете? Автоматически любой тип, объект. Или для всех возможных классов будете клей городить?
И как правило свойства класса это не простые типы, а другие классы. Методы тоже принимают параметры в виде объектов. Вызов статических методов класса итд.
Re[90]: Java vs C# vs C++
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Serginio1, Вы писали:


_>>>Аааа, так оно ещё и через COM это делается... ) Тогда уж точно никакой разницы с другими языками нет, причём уже прямо сейчас. Т.е. банально реализуем соответствующий COM интерфейс и без проблем используем его в 1C. Не знаю правда зачем, но делается это тривиально. )))

S>> Тебе нужно делать обертку Idispatch над объектом, типом. В Net это делается через Reflection к любому типу, объекту
S>>Раз это элементарно забацайка. В той статье класс оборачивает любой объект, тип. Поддержка энумераторов.
S>>Давай прямо сейчас.
S>> Это еще раз подтверждение того, что ты невнимательно читаешь ссылки

S>>Что было понятно то основной метод такой обертки для вызова свойства метода реального объекта.


EP>Вот конкретный пример, правда там обвёртка к Python, а не IDispatch, но тем не менее:

EP>
EP>// наш класс:
EP>struct World
EP>{
EP>    void set(std::string msg) { this->msg = msg; }
EP>    std::string greet() { return msg; }
EP>    std::string msg;
EP>};
EP>// указываем те методы которых хотим экспортировать:
EP>BOOST_PYTHON_MODULE(hello)
EP>{
EP>    class_<World>("World")
EP>        .def("greet", &World::greet)
EP>        .def("set", &World::set)
EP>    ;
EP>}
EP>// можно сократить до вот такого варианта:
EP>PYTHON_MODULE_SIMPLIFIED
EP>(
EP>    hello,
EP>    World,
EP>    greet, set
EP>)
EP>
Использование:

EP>
>>>> import hello
>>>> planet = hello.World()
>>>> planet.set('howdy')
>>>> planet.greet()
EP>'howdy'
EP>

EP>Помимо этого есть автоматические генераторы клея между языками типа SWIG — там даже методы перечислять не нужно.
Ну вы совсем, что ли не читаете? Автоматически любой тип, объект. Или для всех возможных классов будете клей городить?
И как правило свойства класса это не простые типы, а другие классы. Методы тоже принимают параметры в виде объектов. Вызов статических методов класса итд.
Удосужтесь хоть прочитать код. Там совсем другая песня.

Еще раз любой класс или объект оборачивается вокруг
public class AutoWrap : IReflect
    {
// Два основных поля Объект и его тип
        protected internal object O = null;
        protected internal Type T = null;



Конструкторы
 public AutoWrap(object obj)
        {
            O = obj;
            if (O is Type)
            {
                T = O as Type;
                ЭтоТип = true;
            }
            else
            {
                T = O.GetType();
                ЭтоТип = false;
            }



        }

// Бывает нужно обратиться не к статическим методам, а к методат типа
        public AutoWrap(object obj, Type type)
        {
            O = obj;
            T = type;
            ЭтоТип = false;


        }



 public object ТипКакОбъект(object Тип)
        {
            if (Тип is AutoWrap)
                Тип = ((AutoWrap)Тип).T;
            Type T = ((Type)Тип);

            return new AutoWrap(T, T.GetType());
        }



Все мы имеем доступ к любому объекту ил типу

   public object СоздатьОбъект(object Тип, params object[] argOrig)
        {
            //   MessageBox.Show(Тип.ToString() + " параметров=" + args.Length.ToString());

            var res = ТипДляСоздатьОбъект(Тип);

            object[] args = AutoWrap.ПолучитьМассивРеальныхОбъектов(argOrig);
            return AutoWrap.ОбернутьОбъект(System.Activator.CreateInstance(res, args));

        }