C# 使用.NET和COM互操作的多级接口继承
这个问题是我的后续问题,涉及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
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
。。。当然,我们无法告诉您实施所需的内容。如果你必须有一些看起来很疯狂的东西,让它与你的外部应用程序一起工作。。。那这就是你必须要做的。