2013-05-15 3 views
0

C++/CLI에서 추상 C# 클래스를 구현하려고합니다. 이 추상 기본 클래스는 이미에서 INotifyPropertyChanged를 구현하고, C#으로 작성된 언급 한 바와 같이 다음과 같은 경우 상속 지금C++/CLI : INotifyPropertyChanged를 구현하는 추상 C# 클래스를 구현하면 C++ 컴파일러 오류가 발생합니다. C3766

public interface class IAnotherNotifyPropertyChangedClass : public INotifyPropertyChanged 

다음 C++/CLI 어셈블리에서

public abstract class BaseClass : INotifyPropertyChanged 

, 나는에서 INotifyPropertyChanged를 구현하는 또 다른 인터페이스를 가지고 할

public ref class AnotherNotifyPropertyChangedClass : public BaseClass, public IAnotherNotifyPropertyChangedClass 

이 다음 결과 : 추상 C# 클래스의 BaseClass로와 C++/CLI에서 구현 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/C 제외) : http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/3047b8d1-348c-4ca6-b3f3-c396c03fedf7/ C++/CLI의 설계 상 이러한 동작이 있습니까? 는 C# 클래스가 그 알아서 (해야)하지 않는 추상적이기 때문에

#region INotifyPropertyChanged Members 
public event PropertyChangedEventHandler PropertyChanged; 
#endregion 

, 당신이 당신의 C++ 클래스를 구현해야 다음 interafce이 같은 구현을 필요로하기 때문이다

답변

1

. 이것이 추상이 아닌 첫 번째 수업입니다.

+0

인터페이스를 구현하는 C#으로 작성된 추상 클래스입니다. 동일한 시나리오를 순수한 C#에서 (INotifyPropertyChanged를 상속받은 다른 인터페이스를 선언하고 기본 클래스 위에 구현하면) 매력처럼 작동합니다. – barnacleboy

+0

INotifyPropertyChanged의 두 가지 구현이있는 경우 어떻게했는지 말하려고했습니다. 그것은 공용 IEnumerator GetEnumerator()와 IEnumerable.GetEnumerator()와 비슷한 상황입니다. 둘 다 사용할 수 있어야합니다. –

2

C++/CLI 클래스에서 INotifyPropertyChanged를 명시 적으로 구현해야합니다. 이미 구현 된 C# 버전을 호출 할 수 있습니다.

시나리오에서 100 % 확실하지 않은 경우 INotifyPropertyChanged::PropertyChanged 대신 AnotherNotifyPropertyChangedClass::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; 
     } 
    } 
+0

귀하의 요지를 봅니다.이것은 컴파일러가 원하는 것을 수행하는 것입니다 만, C#에서 C++/CLI 클래스를 구현할 때 이것이 왜 필요하지 않은가? – barnacleboy

3

이것은 정상적이지 않으며 이에 대한 재현을 얻지 못합니다. 문제는 실제 코드를 표시하지 않습니다, 내가 보여 줄게 내 :

는 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 
}; 
+0

그게 내가 클래스를 구현 한 방법입니다. 유일한 차이점은 CFoo는 형식 매개 변수를 사용하고 "CFoo "입니다. 순수 C#에서 C++/CLI 코드를 수행하면 모든 것이 예상대로 작동합니다. VS2012와 3.5도 사용하고 있습니까? – barnacleboy

+0

다시 책정 해 볼 수 있습니다. 그러나 그것은 당신이 언급하지 않은 또 다른 세부 사항이있을 때 다시 엄청난 낭비 일 것입니다. 도움을 얻으려면 문제를 나타내는 [SSCCE snippet] (http://sscce.org/)을 게시해야합니다. –