Сценарий, с которым я работаю, выглядит следующим образом:
public interface INativeWindow { ... }
— это собственный оконный тип интерфейса, содержащий несколько необходимых базовых методов, которые необходимо реализовать, чтобы иметь минимальную поддержку окна (например, свертывание, восстановление и т. д.). Это интерфейс C#, принадлежащий проекту интерфейсов.
Теперь я хочу реализовать его в классе CLINativeWindow
c++-cli:
public ref class CLINativeWindow: public SWF::NativeWindow, INativeWindow
{
...
}
Наконец, у меня есть еще один класс ref
c++ cli, который имеет внутренний член типа CLINativeWindow
и свойство-оболочку, которое возвращает дескриптор INativeWindow^
:
virtual property INativeWindow^ OwnNativeWindow
{
INativeWindow^ __clrcall get() sealed { return NativeWindow;}
void __clrcall set(INativeWindow^ value) { NativeWindow = dynamic_cast<CLINativeWindow^>(value);}
}
Проблема здесь в том, что dynamic_cast
не работает, равно как и неявное полиморфное преобразование вниз из метода получения свойства. Если я не дезинформирован, я думаю, что читал в нескольких местах, что в C++ с указателями normal такая ошибка действительно работает. Теперь, поскольку SWF::NativeWindow
является классическим классом Windows Forms, собственным классом окна (извините за непреднамеренную аллитерацию), он должен иметь виртуальный метод, так же, как и интерфейс, поэтому для оператора динамического приведения не возникает проблем, поскольку задействовано полиморфное наследование. Я ошибаюсь или это просто невозможно в CLI dotNet C++?
ИЗМЕНИТЬ дополнительный код:
public ref class ExampleForSO
{
CLINativeWindow^ NativeWindow;
virtual property INativeWindow^ OwnNativeWindow
{
INativeWindow^ __clrcall get() sealed { return NativeWindow;}
void __clrcall set(INativeWindow^ value) { NativeWindow = dynamic_c
ast<CLINativeWindow^>(value);}
}
}
Ошибки возникают во время компиляции, и они утверждают, что преобразование/приведение не может быть выполнено как для геттера, так и для сеттера (т.е. невозможно преобразовать из B^ в A^ и из B^ в A^). ОБНОВЛЕНИЕ Если классы находятся в разных файлах, реализация свойства в заголовке не годится. Реализация его в отдельном исходном файле .cpp
больше не вызывает ошибки времени компиляции и работает так, как хотелось бы.