2010-06-18 8 views
1

이 질문은 COM Interop에 대한 참조 내용을 담고있는 last question의 후속 조치입니다. VB.NET에서.NET 및 COM을 통한 다중 레벨 인터페이스 상속 Interop

public interface ISkuItem 
{ 
    public string SKU { get; set; } 
} 

public interface ICartItem : ISkuItem 
{ 
    public int Quantity { get; set; } 
    public bool IsDiscountable { get; set; } 
} 

public class CartItem : ICartItem 
{ 
    //implemented properties... 
} 

또는 :

Public Interface ISkuItem 
    Property SKU() As String 
End Interface 

Public Interface ICartItem 
    Inherits ISkuItem 
    Property Quantity() As Integer 
    Property IsDiscountable() As Boolean 
End Interface 

Public Class CartItem 
    Implements ICartItem 

    'Implemented Properties' 
End Class 

인터페이스는 인텔리에 속성과 메소드를 노출 COM의 상호 운용성에 중요하다

의 내가 다음 2 인터페이스와 구현 클래스가 있다고 가정 해 봅시다 VB6 IDE (this article). 그러나 ICartItemISkuItem에서 상속되므로 SKUICartItem에 명시 적으로 정의되어 있지 않으므로 VB6의 IntelliSense에는 표시되지 않으며 objCartItem.SKU에 쓸 때 컴파일러 오류가 발생합니다.

내가 ISkuItemSKU 재산 ShadowsOverloads를 사용하여 시도했다, 그러나 다른 컴파일러 나 명시 적으로 CartItem 클래스 내에서 모두ISkuItemICartItem에 대한 SKU을 구현하고자합니다. 나는 그것이 내가 원하는 것이라고 생각하지 않는다.

명시 적으로 CartItem 클래스에 두 번 SKU를 선언하지 않고 ICartItem에서 SKU 속성을 선언하는 (VB.NET 또는 C#을 하나의) 방법이 있나요?

답변

1

당신은 마태 복음에서 알 수 있듯이 할 새로운를 제공 할 수있다 (Shadows) SKU 구성원을 ICartItem. 그러나 당신이 알고 있다고 확신 하듯이, 이것은 인터페이스 상속을 쓸모 없게 만듭니다.

정말이 인터페이스 상속 모델이 잘 작동하지 않는 것 같습니다.

ICartItem이 (가) ISkuItem에서 상속 받았다고 확신하십니까?

두통을 겪기보다는 ICartItemSKU 속성을 제공하고 ISkuItem을 상속받지 않을 수 있습니다. 그런 다음 ICartItem를 구현하는 모든 클래스가 또한 명시 적으로 ISkuItem을 구현 선택적으로 수 (.NET에서와 마찬가지로 많은 컬렉션 클래스는 ICollection<T>ICollection으로, 예를 들어, 할); 그러나 어떤 식 으로든 SKU 속성을 갖습니다.

이것은 디자인 선택이 아닙니다. 일반적으로, 마음에 드십니까? 그러나 COM interop에 관해서는 때로는 벽에 머리를 영원히 대고 싶지 않기 때문에 희생해야합니다.

나는이 질문에 대해 매우 만족스러운 답을 얻지 못할지 잘 모르겠다. VB6만으로는 .NET이하는 모든 것을 이해할 수 없기 때문에 .NET 기능과 COM 동등 물을 완벽하게 1 : 1 매핑 할 수는 없습니다.

+0

몇 가지 정말 좋은 점이 있습니다. 결국이 상속이 COM에서 작업 할 때 많은 불필요한 골치 거리를 유발한다는 점에서 하루가 끝났습니다. 그것을 단순화하고 계속 나아갈 시간. –

+0

Dan이 말했듯이'ICartItem'은'ISkuItem'에서 상속받을만한 가치가 없을 수도 있습니다. 그러나'CartItem'이'ICartItem'과'ISkuItem' 둘 모두를 내포하기를 원할지도 모릅니다. 물론 우리가 당신의 임 플레멘 테이션에 필요한 것을 말할 수는 없습니다. 누군가에게 미친 것처럼 보이는 것이 있다면 외부 앱과 함께 작동합니다. 그러면 당신이해야 할 일입니다. –

2

각 인터페이스마다 다른 구현을 필요로하지 않는다면 구현을 묵시적으로 정의하기 만하면됩니다.

... C#을 ...

public interface ISkuItem 
{ 
    string SKU { get; set; } 
} 
public interface ICartItem : ISkuItem 
{ 
    new string SKU { get; set; } 
} 
public class CartItem : ICartItem 
{ 
    public string SKU { get; set; } 
} 

... VB.Net ...

Public Interface ISkuItem 
    Property SKU() As String 
End Interface 

Public Interface ICartItem 
    Inherits ISkuItem 
    Shadows Property SKU() As String 
End Interface 

Public Class CartItem 
    Implements ICartItem 

    Private _sku As String 
    Public Property SKU() As String Implements ICartItem.SKU, ISkuItem.SKU 
     Get 
      Return _sku 
     End Get 
     Set(ByVal value As String) 
      _sku = value 
     End Set 
    End Property 

End Class 
+0

너무 아름다워 보이지만 ... VB6에서는 작동하지 않습니다. 이상하게도, VB6 응용 프로그램은 ICartItem 객체와 같게 CartItem 객체를 할당하려고 할 때 코드의 이전 부분에 오류를 발생시킵니다. 전에는 ICartItem 객체의 SKU 속성을 설정하려고했을 때만 오류가 발생했습니다. 제로 그래, 그것은 시험 할만한 가치가 있었다. –

+0

VB6은 실제로 객체 지향적이지 않습니다. 그러고 싶지만 ... 많은 분야에서 부족합니다. –