2017-12-06 55 views
1

나는 C++/cli로 작성된 추상 기본 클래스를 사용하고 있습니다. 이 클래스는 프로젝트에 있습니다. 그리고 난 abtract 기본 클래스를 상속 다른 프로젝트가 있습니다. 그래서 구조는 다음과 같습니다.clr 프로젝트 dll 사이의 상속

자료 프로젝트 :

public ref class Base abstract 
{ 
    // implementation 
    virtual CommonFunc(); 
}; 
public delegate void Foo(); 

파생 프로젝트 A :

public ref class A : public Base 
{ 
    // implementation 
}; 

파생 프로젝트 B : 그래서

public ref class B : public Base 
{ 
    // implementation 
}; 

그리고,. C# 프로젝트에서 A와 B 클래스를 모두 호출 할 수 있습니다. 그거 아무 문제 없어.

그러나 Foo 대리자를 Base로 사용하려고하면 다음과 같은 오류가 발생합니다.

오류 : '푸'는 '푸'는

이 제거하려면 '푸'사이 모호한 참조입니다. C# 프로젝트에서 A와 B 참조에 대한 extern 별칭을 정의했습니다. 그래서, 내가 AliasA.Foo와 같이 사용할 때, 괜찮습니다. 그러나 두 개의 A와 B dll에 두 개의 Foo가 있습니다. 그게 문제 야. 암시 적으로 변환 할 수 없습니다 : 나는 다음과 같은 몇 가지 코드를 개발하려고 할 때

그리고 마지막에

는, 컴파일러는
AliasBase.Base base = new A(); 
base.CommonFunc(); 
base = new B(); 
base.CommonFunc(); 

오류

AliasBase.Base가 A의 기본임을 모르는 'A'에서 'Base'까지 입력하십시오.

내가 분명히했으면 좋겠습니다. 여름철에; 나는 세 dll 있습니다. 그들 중 하나는베이스의 dll이고 다른 것은 상속 된 클래스의 dll입니다. 상속 된 클래스의 dll에는 내부에 자체 기본 구현이 포함되어 있습니다. 기본 클래스의 여러 implemtantatins를 제거 할 수있는 방법이 있습니까?

참고 : 예, 프로젝트에 수집하면 문제가 없습니다. 그러나, 나는 파생 된 모든 항목에 대해 별도의 dll을 제공해야합니다.

미리 감사드립니다.

+0

이것은 아마도 .h 파일에 넣고 다른 소스 파일에 # 포함시킨 코드 일 것입니다. 이제는 Base와 Foo의 여러 정의가 있습니다. 그리고 B와 C는 기본 클래스가 같지 않습니다. 아직 실행하지 못했지만 아마도 그렇게 될 것입니다. .h 파일을 사용하지 말고 A 및 B 프로젝트는 Base에 대한 어셈블리 참조를 사용해야합니다. –

+0

답장을 보내 주셔서 감사합니다. #include "Base.h"라인을 제거하고 inheretec 클래스의 프로젝트에 Base 프로젝트에 대한 참조를 추가합니다. 그러나 이제 Base 클래스를 인식 할 수 없습니다. # import "Base.dll"을 추가하려고했지만 파일을로드 할 수 없습니다. 뭐가 문제 야? –

+0

물론 추측하기 어렵습니다. 큰 변화, IntelliSense를 충분히 똑똑하게 만들기 위해서는 Build> Rebuild가 꼭 필요합니다. 네임 스페이스를 조심하십시오. 우리가 볼 수없는 다른 것입니다. 이전에 아무 것도 사용하지 않았다면, 이제'namespace'를 사용하는 문장을 추가해야합니다. –

답변

0

한스 패트 란트 (Hans Passant)가 코멘트에서 제안한 것처럼, 헤더 파일을 제거하고 참조 만 사용하여 최종 상속 효과를 얻었습니다. C# 측의 기본 클래스에 대해 하나의 별칭 만 설정해야했으며 parant 클래스와의 상속 관계가 있습니다. 이제 다음 코드가 작동합니다.

AliasBase.Base base = new A(); 
base.CommonFunc(); 
base = new B(); 
base.CommonFunc();