Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.048 c
15-1335040202
Юрий
2012-04-22 00:30
2013.03.22
С днем рождения ! 22 апреля 2012 воскресенье


15-1354200038
Паскаль
2012-11-29 18:40
2013.03.22
3 не сложных задания по ПАСКАЛЮ / заплачу пару баксов за них


15-1344630602
Юрий
2012-08-11 00:30
2013.03.22
С днем рождения ! 11 августа 2012 суббота


15-1346298363
brother
2012-08-30 07:46
2013.03.22
Помогите с алгоритмом


15-1334125667
boriskb
2012-04-11 10:27
2013.03.22
Построение равносторонего треугольника