Главная страница
    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.057 c
2-1338127419
Глеб
2012-05-27 18:03
2013.03.22
Перенос данных из дельфи в хмл


2-1342699186
vasa777
2012-07-19 15:59
2013.03.22
правое меню


4-1227867160
dmitry_12_08_73
2008-11-28 13:12
2013.03.22
Запрещение реакции на нажатие кнопки WIN на клавиатуре


2-1338991657
начинающий41
2012-06-06 18:07
2013.03.22
Sender: TObject


15-1339791776
OPOPO
2012-06-16 00:22
2013.03.22
Как отключить Alt+Tab В XP?





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