2010-01-17 2 views
0

COM-interop을 통해 호출되는 C# DLL의 코드베이스를 상속 받았습니다 (또는 설명되어 있습니다). 또한 C# 코드는 내부적으로 COM 개체를 사용하여 부모 응용 프로그램의 기본 기능을 수행합니다.기본 클래스의 COM 개체 - 필드 또는 속성을 통한 액세스?

50 개 또는 60 개의 DLL에 걸쳐 100,000 줄의 코드에서 중복을 찾는 것이 비효율적이므로 일부 DRY 위반을 코드에서 리팩토링하고 있습니다. 나는 약간의 표준화를 원한다는 추상적 인 기본 클래스에서 COM 객체의 사용을 보았습니다. 그러나 C#에서 COM 객체의 이러한 특정 사용에 관해 명확하게 결정적인 진술을 발견하지 못했습니다.

우리의 코드는 현재 다음과 같이 코딩 COM 객체를 포함 할 몇 가지 기본 클래스가 : 초기화() 이외로 설정되는 this.comObject을 방지하기 위해

public abstract class SomeBaseClass() 
{ 
    protected IComObject comObject; 

    protected virtual void Initialize(IComObject comObject) 
    { 
     this.comObject = comObject; 
    } 

    protected SomeBaseClass() { } 
} 

, 나는 이러한 기반을 구현하고 싶습니다를 다음과 같은 클래스가 있습니다 :

public abstract class SomeBaseClass() 
{ 
    private IComObject comObject; 

    protected IComObject ComObject 
    { 
     get { return comObject; } 
    } 

    protected virtual void Initialize(IComObject comObject) 
    { 
     this.comObject = comObject; 
    } 

    protected SomeBaseClass() { } 
} 

제 생각에는 두 번째 예제가 더 좋아 보이고 내부 comObject를보다 잘 제어 할 수 있습니다.

현재 기존 파생 클래스 (C#)는 기본 클래스 comObject를 직접 초기화하지 않고 Initialize()를 사용하여 기본 클래스 comObject에 직접 할당하지 못하게합니다. 나는 ComObject를 Initialize() 밖에서 할당하는 잠재적 인 실수를 막기를 원한다.

COM 개체 처리의 두 번째 기본 클래스 구현이 작동하지 않는 이유가 있습니까? 내 제한된 테스트에서는 잘 작동하는 것 같지만, 너희들은 나보다 똑똑하다.

감사합니다.

+0

이 COM 시나리오는 100 % (그러므로 대답이 아닙니다.) 모르겠지만 일반적으로 필드는 비공개 *되어야합니다. 그래서 나는 옵션 2를 투표한다. –

+0

@ 마르크 : 고마워, 그건 내 생각을 반영한다. 함정을 피하기를 희망합니다. ;V) – james

답변

0

두 번째 대소 문자를 처음과 다른 것으로 만드는 COM Interop에는 아무 것도 없습니다. 입력란의 액세스 수정자를 비공개로 자유롭게 조정하십시오.