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/ |