Форум: "Прочее";
Текущий архив: 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