OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 27 Апрель, 2024 22:50

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
СообщениеДобавлено: Четверг, 25 Март, 2010 14:48 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Сергей Губанов неоднократно подчёркивал, что в .NET невозможно эффективно реализовать обероновскую Generic Message Bus, так как классы, для которых возможно наследование, являюттся ссылочным типом, то есть медленным, а структуры не могут иметь иерархию наследования.
Однако структуры же могут реализовывать интерфейсы, которые, в свою очередь, могут реализовывать иерархии наследования (даже множественного).
Не знаю, правда, насколько эффективно реализуется такой гибрид, но как вариант для экспериментов можно попробовать, ежели кому надо:
Код:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace Test_GMB
{
    public interface ITest1
    {
        void Test1();
    }

    public interface ITest2 : ITest1
    {
        void Test2();
    }

    public interface ITest3 : ITest1
    {
        void Test3();
    }

    public struct Struct1 : ITest1
    {
        public bool bdata;

        public void Test1()
        {
            MessageBox.Show("ITest1.Test1()");
        }
    }

    public struct Struct2 : ITest2
    {
        public string sdata;

        public void Test1()
        {
            MessageBox.Show("ITest2.Test1()");
        }

        public void Test2()
        {
            MessageBox.Show("ITest2.Test2()");
        }
    }

    public struct Struct3 : ITest3
    {
        public int idata;

        public void Test1()
        {
            MessageBox.Show("ITest3.Test1()");
        }

        public void Test3()
        {
            MessageBox.Show("ITest3.Test3()");
        }
    }

    public class Test
    {
        static public void test(ITest1 strct)
        {
            if (strct is ITest2)
            {
                ((ITest2)strct).Test2();
            }
            else if (strct is ITest3)
            {
                ((ITest3)strct).Test3();
            }
            else
            {
                strct.Test1();
            }
        }

        static public void DoTest()
        {
            Struct1 s1; s1.bdata = true;
            Struct2 s2; s2.sdata = "string";
            Struct3 s3; s3.idata = 1;

            test(s1);
            test(s2);
            test(s3);
        }
    }
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 25 Март, 2010 17:39 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Geniepro писал(а):
так как классы, для которых возможно наследование, являюттся ссылочным типом, то есть медленным
Вы думаете инструкция IS в дотнете в несколько раз медленнее чем в обероне из-за ссылочности что ли?
Geniepro писал(а):
Однако структуры же могут реализовывать интерфейсы, которые, в свою очередь, могут реализовывать иерархии наследования (даже множественного).
Не знаю, правда, насколько эффективно реализуется такой гибрид, но как вариант для экспериментов можно попробовать, ежели кому надо:
То есть сами Вы не проверили?

----------------------------

Переменная интерфейсного типа - ссылочная. Если интерфейс реализова в структуре, то в момент превращения её в интерфейсную переменную она боксится (создаётся её копия в динамической памяти).

IS в дотнете работает медленее чем в Обероне из-за другой реализации которая другая из-за множественного наследования интерфейсов.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 26 Март, 2010 08:50 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Сергей Губанов писал(а):
То есть сами Вы не проверили?

Компилируется, выполняется правильно, а с какой скоростью -- не определял...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB