OberonCore
https://forum.oberoncore.ru/

[C#] Имитация обероновской Generic Message Bus
https://forum.oberoncore.ru/viewtopic.php?f=27&t=2482
Страница 1 из 1

Автор:  Geniepro [ Четверг, 25 Март, 2010 14:48 ]
Заголовок сообщения:  [C#] Имитация обероновской Generic Message Bus

Сергей Губанов неоднократно подчёркивал, что в .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 ]
Заголовок сообщения:  Re: [C#] Имитация обероновской Generic Message Bus

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

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

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

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

Автор:  Geniepro [ Пятница, 26 Март, 2010 08:50 ]
Заголовок сообщения:  Re: [C#] Имитация обероновской Generic Message Bus

Сергей Губанов писал(а):
То есть сами Вы не проверили?

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/