C ++ / CLI: реализация абстрактного класса C #, реализующего INotifyPropertyChanged, приводит к ошибке компилятора C ++ C3766

Я пытаюсь реализовать абстрактный класс 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 по замыслу ?!

0

Решение

Это не нормально, и я не получаю за это копию. Вопрос не показывает реальный код, я покажу мой:

Тестовый класс 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
};
3

Другие решения

Что вам нужно сделать, это иметь явную реализацию 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;
}
}
2

Это потому, что для взаимодействия требуется такая реализация:

#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion

Поскольку класс C # является абстрактным, он не должен об этом заботиться, и вам необходимо реализовать его в своем классе C ++. Это первый класс, который не является абстрактным.

1
По вопросам рекламы [email protected]