Главная страница
    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.074 c
15-1350631915
AV
2012-10-19 11:31
2013.03.22
MSSQL. Посоветуйте индексы на таблицу


15-1328042693
Димка На
2012-02-01 00:44
2013.03.22
Максимальная версия программы (продукта)


15-1352901277
ЕщеОдинКакжеНадоели
2012-11-14 17:54
2013.03.22
Удалить кусок текста.


15-1339966494
Jeer
2012-06-18 00:54
2013.03.22
Вело-Вапдай


15-1346322658
Артём
2012-08-30 14:30
2013.03.22
Как программно нажать на кнопку на сайте?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский