Я пытаюсь реализовать абстрактный класс C # в C ++ / CLI. Этот абстрактный базовый класс уже реализует INotifyPropertyChanged и, как уже упоминалось, написан на C #:
public abstract class BaseClass : INotifyPropertyChanged
В сборке C ++ / CLI у меня есть еще один интерфейс, который реализует INotifyPropertyChanged:
public interface class IAnotherNotifyPropertyChangedClass : public INotifyPropertyChanged
Теперь при наследовании от абстрактного класса C # BaseClass и реализации IAnotherNotifyPropertyChangedClass в C ++ / CLI я получаю следующее:
public ref class AnotherNotifyPropertyChangedClass : public BaseClass, public IAnotherNotifyPropertyChangedClass
Это приводит к следующей ошибке компиляции:
error C3766: 'AnotherNotifyPropertyChangedClass' must provide an implementation for the interface method 'void System::ComponentModel::INotifyPropertyChanged::PropertyChanged::add(System::ComponentModel::PropertyChangedEventHandler ^)'
Как только я удаляю INotifyPropertyChanged из объявления интерфейса IAnotherNotifyPropertyChangedClass, все компилируется нормально. Это почему? Это объявление будет хорошо скомпилировано при использовании C #. Я использую VS 2012 и компилирую сборку .NET 3.5 в смешанном режиме.
Заранее спасибо!
Ура!
Редактировать:
Подобная проблема (без C #) здесь: http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/3047b8d1-348c-4ca6-b3f3-c396c03fedf7/
Так это поведение в C ++ / CLI по замыслу ?!
Это не нормально, и я не получаю за это копию. Вопрос не показывает реальный код, я покажу мой:
Тестовый класс C #:
using System.ComponentModel;
namespace ClassLibrary8 {
public abstract class CFoo : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
}
}
Тестовый код C ++ / CLI, после добавления ссылки на проект C #:
using namespace System::ComponentModel;
public interface class IBar : public INotifyPropertyChanged {
};
public ref class Baz : ClassLibrary8::CFoo, IBar {
// fine
};
Что вам нужно сделать, это иметь явную реализацию INotifyPropertyChanged в вашем классе C ++ / CLI. Вы можете использовать его для вызова уже реализованной версии C #.
Я не уверен на 100% в вашем сценарии, возможно, вам придется явно реализовать AnotherNotifyPropertyChangedClass::PropertyChanged
вместо INotifyPropertyChanged::PropertyChanged
,
private:
event PropertyChangedEventHandler^ DuplicatePropertyChanged
{
virtual void add (PropertyChangedEventHandler^ value) sealed =
INotifyPropertyChanged::PropertyChanged::add
{
// Add to the event defined in the C# class.
this->PropertyChanged += value;
}
virtual void remove (PropertyChangedEventHandler^ value) sealed =
INotifyPropertyChanged::PropertyChanged::remove
{
// Remove from the event defined in the C# class.
this->PropertyChanged -= value;
}
}
Это потому, что для взаимодействия требуется такая реализация:
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
Поскольку класс C # является абстрактным, он не должен об этом заботиться, и вам необходимо реализовать его в своем классе C ++. Это первый класс, который не является абстрактным.