C# 使用.NET和COM互操作的多级接口继承

C# 使用.NET和COM互操作的多级接口继承,c#,.net,vb.net,oop,interop,C#,.net,Vb.net,Oop,Interop,这个问题是我的后续问题,涉及COM互操作 假设我有以下两个接口和实现类: public interface ISkuItem { public string SKU { get; set; } } public interface ICartItem : ISkuItem { public int Quantity { get; set; } public bool IsDiscountable { get; set; } } public clas

这个问题是我的后续问题,涉及COM互操作

假设我有以下两个接口和实现类:

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...
}
或者,在VB.NET中:

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互操作中非常重要,用于在VB6 IDE(per)中将属性和方法公开给IntelliSense。但是,由于
iCarItem
继承自
ISkuItem
SKU
未在
iCarItem
中明确定义,因此在VB6中IntelliSense中不可见,甚至在尝试写入
objCarItem.SKU
时引发编译器错误

我曾尝试在
ISkuItem
中的
SKU
属性上使用
Shadows
Overloads
,但是编译器希望我在
CartItem
类中显式地为
ISkuItem
ICartItem
实现
SKU
。我想那不是我想要的


有没有办法(在VB.NET或C#中)要在
ICartItem
中显式声明
SKU
属性,而不必在
CartItem
类中声明
SKU
两次?

除非每个接口需要不同的实现,否则只需隐式定义实现即可

。。。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

您可以按照Matthew的建议,为
iCarItem
提供一个新的(
Shadows
SKU
成员。但我相信您已经意识到,这几乎使您的接口继承毫无用处

看起来这个接口继承模型并不适合您

您确定从
ISkuItem
继承
ICartItem
实际上是在给您买东西吗

与其为此头疼,我可能更倾向于让
ICartItem
提供自己的
SKU
属性,而不是从
ISkuItem
继承。然后,任何实现
iArtItem
的类都可以选择显式地实现
ISkuItem
(就像.NET中的许多集合类一样,例如使用
ICollection
ICollection
);但无论哪种方式,它都将具有
SKU
属性

请注意,这不是我通常会做出的设计选择(我会选择你所拥有的);但是当涉及到COM互操作时,有时你不得不做出牺牲,因为你不想永远把头撞在墙上


我不确定你会得到一个非常满意的答案。VB6不能完全理解.NET所做的一切,因此您无法将.NET功能完美地1:1映射到COM等效功能。

它看起来很漂亮,但是…它在VB6中不起作用。奇怪的是,VB6应用程序在尝试将CartItem对象指定为等于iCarItem对象时,在代码的前面位置抛出了一个错误。以前,它只在我尝试设置iCarItem对象的SKU属性时抛出错误。哦,值得一试。VB6实际上不是面向对象的。它希望是。。。但它在很多方面都是不足的。你提出了几个非常好的观点。说到底,您是对的,在使用COM时,这种继承会造成很多不必要的麻烦。是时候简化它并继续前进了。正如丹所说,它可能不值得从
ISkuItem
继承
iCaritem
。但是您可能希望
CartItem
同时实现
ICartItem
ISkuItem
。。。当然,我们无法告诉您实施所需的内容。如果你必须有一些看起来很疯狂的东西,让它与你的外部应用程序一起工作。。。那这就是你必须要做的。