Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

C# и генерирование TLB   Найти похожие ветки 

 
Pit   (2012-03-23 18:28) [0]

Приветствую!

Существуют два класса на шарпе, метод одного из классов выдает экземпляр второго класса. И на эти два класса есть два интерфейса.

Метод My.getChild возвращает экземпляр класса MyChild.
Как-то вот так:

   [ComVisible(true)]
   [Guid("FFEE83AD-57F4-4E39-998E-CC0B22E015E3")]
   [InterfaceType(ComInterfaceType.InterfaceIsDual)]
   public interface IMyChild
   {
       int getAnything();
   }
   
   [ComVisible(true)]
   [Guid("CB7414F6-D3F0-49FE-9354-C93A67944E2B")]
   [InterfaceType(ComInterfaceType.InterfaceIsDual)]
   public interface IMy
   {
       IMyChild getChild();
   }

   public class MyChild : IMyChild
   {
       public int getAnything()
       {
           return 0;
       }
   }

   public class My : IMy
   {
       public MyChild getChild()
       {
           return new MyChild();
       }
   }


Данный код не скомпилится. Потому что у класса My согласно наследованию от IMy нет метода, который возвращает IMyChild. В принципе, я в этом с компилятором согласен.

Но, я хочу какую ситуацию... Чтобы в шарпе свободно работать с шарповскими классами, а вот наружу по COM-технологии, естественно, интерфейсы отдавать. То есть, если бы компилятор "скушал" вышеуказанные конструкции - я бы был доволен. Но так нельзя.

Делать _дублирующие_ методы не хочется:

public class My : IMy
   {
       public MyChild getChild() ...
       public IMyChild getChild() ...
   }


при этом еще так и нельзя, поскольку входные параметры идентичны... Придётся еще и метод обзывать по-другому.

Можно интерфейсы по-другому объявить, вместо:

public interface IMy
   {
       IMyChild getChild();
   }


объявить:

public interface IMy
   {
       MyChild getChild();
   }


Хотелось бы, конечно, чтобы компилятор "догадался" и сгенерировал TLB таким образом, чтобы интерфейс IMy возвращал интерфейс IMyChild, а не класс MyChild. Но нет, через TLB интерфейс получается такой:

IMy = interface(IDispatch)
   ["{CB7414F6-D3F0-49FE-9354-C93A67944E2B}"]
   function getChild: IUnknown; safecall;
 end;


Что опять же логично, поскольку COM ничего не знает о классе MyChild. Можно сделать MyChild видимым для COM-а:

   [ComVisible(true)]
   [Guid("1C40E815-CF3E-48F9-84CF-B0A9A3A8FF8D")]
   [ClassInterface(ClassInterfaceType.AutoDual)]
   public class MyChild : IMyChild


Тогда TLB будет сконструирована так:

IMy = interface(IDispatch)
   ["{CB7414F6-D3F0-49FE-9354-C93A67944E2B}"]
   function getChild: _MyChild; safecall;
 end;


где

_MyChild = interface(IDispatch)
...
...


с кучей всяческих полей. То есть, все public-поля класса MyChild. Но мне то нужна правильная реализация IMy, метод которой возвращает IMyChild. И я не хочу все public поля шарповские выносить в COM.


 
Pit   (2012-03-23 19:16) [1]

слушайте... удалите это ветку ))
Я чего-то писал писал вопрос... и сам в результате разобрался ))


 
jack128_   (2012-03-23 22:19) [2]


>
> public class My : IMy
>    {
>        public MyChild getChild() ...
>        public IMyChild getChild() ...
>    }
>
> при этом еще так и нельзя, поскольку входные параметры идентичны.
> ..

вообще в данном случае так можно. Читай про явную реализацию интерфейсов


 
Pit   (2012-03-24 19:55) [3]


> вообще в данном случае так можно

Не, нельзя


 
Pit   (2012-03-24 19:57) [4]

а хотя не, можно



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.068 c
15-1342270401
Студент_1234
2012-07-14 16:53
2013.03.22
Напомните функцию, которая реагирует на Input.


15-1348042361
Просто_Андрей
2012-09-19 12:12
2013.03.22
Какой SSD выбрать


15-1352384190
Artem
2012-11-08 18:16
2013.03.22
Можно ли сменить размер виртуального диска в VirtualBox?


15-1351492704
oldman
2012-10-29 10:38
2013.03.22
Задачка. Ответа я не знаю.


2-1340112867
lavren
2012-06-19 17:34
2013.03.22
Новый пользователь AD





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский