Ben*_*ack 5 .net c# vb.net oop inheritance
假设我有2个接口定义如下:
public interface ISkuItem
{
public string SKU { get; set; }
}
public interface ICartItem : ISkuItem
{
public int Quantity { get; set; }
public bool IsDiscountable { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我在C#中实现接口时,VS会生成以下模板化代码:
public class CartItem : ICartItem
{
#region ICartItem Members
public int Quantity { get {...} set {...} }
public bool IsDiscountable { get {...} set {...} }
#endregion
#region ISkuItem Members
public string SKU { get {...} set {...} }
#endregion
}
Run Code Online (Sandbox Code Playgroud)
在VB.NET中,同样的类是这样构建的:
Public Class CartItem
Implements ICartItem
Public Property IsDiscountable As Boolean Implements ICartItem.IsDiscountable
'GET SET'
End Property
Public Property Quantity As Integer Implements ICartItem.Quantity
'GET SET'
End Property
Public Property SKU As String Implements ISkuItem.SKU
'GET SET'
End Property
End Class
Run Code Online (Sandbox Code Playgroud)
VB.NET明确要求您Implements IInterfaceName.PropertyName在每个实现的属性之后添加,而C#只是使用regions来指示哪些属性和方法属于该接口.
有趣的是在VB.NET中,在SKU属性上,我可以指定Implements ISkuItem.SKU或者Implements ICartItem.SKU.虽然由VS构建的模板默认为ISkuItem,但我也可以指定ICartItem是否需要.奇怪的是,因为C#只使用regions来阻止继承的属性,所以我似乎SKU无法在VB.NET中明确指定C#中的实现接口.
我的问题是:能否指定一个或另一个接口来实现VB.NET中的属性是否有任何重要性?如果是这样,有没有办法在C#中模仿这个功能?此外,在实现属性时,指定一个接口与另一个接口的效果是什么?
我认为其他答案实际上有点不合适.
在您发布的示例中,一个接口继承自另一个接口.这仅仅意味着它提供与其基础相同的成员,以及一些其他成员.
这些不是两个独立的接口,恰好暴露了具有相同名称的成员.ICartItem.SKU 是一样的 ISkuItem.SKU.这种ICartItem继承ISkuItem仅仅意味着ISkuItem,作为一个接口,代表了提供的功能的一个子集ICartItem.
考虑以下代码:
class CartItem : ICartItem
{
public int Quantity { get; set; }
public bool IsDiscountable { get; set; }
string ISkuItem.SKU
{
get { return "ISkuItem"; }
set { throw new NotSupportedException(); }
}
string ICartItem.SKU
{
get { return "ICartItem"; }
set { throw new NotSupportedException(); }
}
}
Run Code Online (Sandbox Code Playgroud)
这个类不会编译.ICartItem.SKU在这种情况下,您无法明确定义,因为ICartItem.SKU它只是ISkuItem.SKU.没有"其他" SKU属性可以定义.
所以,直接回答你的问题:
在VB.NET中能够指定一个或另一个接口来实现本地化是否有任何重要性?
当它们是分开的,不相关的接口时:是的.
正如其他人所指出的,您可以为共享通用名称的不同接口成员提供不同的实现.
但是当一个接口继承另一个接口时:没有.
这没关系,因为它们是一回事.
在实现适当的时候,指定一个接口而不是另一个接口有什么影响?
同样,如果它们是不相关的接口,它具有其他人已经讨论过的效果:为这两个接口提供不同的实现.但如果一个人从另一个人那里获得,它就没有效果.
| 归档时间: |
|
| 查看次数: |
2434 次 |
| 最近记录: |