繁体   English   中英

.NET和COM Interop的多级接口继承

[英]Multi-level interface inheritance with .NET and COM Interop

这个问题是我对COM Interop的最后一个问题的跟进。

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

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中的IntelliSense很重要(根据本文 )。 但是,由于ICartItem是从ISkuItem继承的, ISkuItem SKUICartItem未明确定义,因此在VB6的IntelliSense中不可见,甚至在尝试写入objCartItem.SKU时也会引发编译器错误。

我已经尝试使用ShadowsOverloadsSKU财产ISkuItem ,但随后的编译器要我明确地实现SKU 两个 ISkuItemICartItem的内CartItem类。 我认为那不是我想要的。

有没有办法(在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的建议进行操作,并为ICartItem提供一个新的( ShadowsSKU成员。 但是,正如我确定的那样,这几乎使您的接口继承无用。

看来该接口继承模型对您而言并不奏效。

您确定让ICartItem继承自ISkuItem确实在买东西吗?

我可能不愿意为此烦恼,反而会倾向于让ICartItem提供其自己的SKU属性,而不是完全继承自ISkuItem 然后,任何实现ICartItem可以选择显式实现ISkuItem (与.NET中的许多收集类一样,例如,使用ICollection<T>ICollection ); 但无论哪种方式,它都将具有SKU属性。

请记住,这不是我通常会做出的设计选择(我会选择您拥有的东西); 但是当涉及到COM互操作时,有时您只需要做出牺牲,因为您不想永远把头撞在墙上。

我不确定您会在这个问题上得到满意的答复。 VB6完全无法理解.NET的所有功能,因此您将无法弄清.NET功能与COM等效项的完美1:1映射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM