[英]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
SKU
在ICartItem
未明确定义,因此在VB6的IntelliSense中不可见,甚至在尝试写入objCartItem.SKU
时也会引发编译器错误。
我已经尝试使用Shadows
和Overloads
的SKU
财产ISkuItem
,但随后的编译器要我明确地实现SKU
两个 ISkuItem
和ICartItem
的内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
提供一个新的( Shadows
) SKU
成员。 但是,正如我确定的那样,这几乎使您的接口继承无用。
看来该接口继承模型对您而言并不奏效。
您确定让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.