加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

VB.NET与C#中的属性实现的多级继承

发布时间:2020-12-17 00:05:44 所属栏目:大数据 来源:网络整理
导读:假设我有2个接口定义如下: public interface ISkuItem{ public string SKU { get; set; }}public interface ICartItem : ISkuItem{ public int Quantity { get; set; } public bool IsDiscountable { get; set; }} 当我在C#中实现接口时,VS会生成以下模板化
假设我有2个接口定义如下:
public interface ISkuItem
{
    public string SKU { get; set; }
}

public interface ICartItem : ISkuItem
{
    public int Quantity { get; set; }
    public bool IsDiscountable { get; set; }
}

当我在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
}

在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

VB.NET明确要求您在每个实现的属性之后添加Implements IInterfaceName.PropertyName,而C#只使用区域来指示哪些属性和方法属于该接口.

有趣的是在VB.NET中,在SKU属性上,我可以指定Implements ISkuItem.SKU或Implements ICartItem.SKU.虽然VS构建的模板默认为ISkuItem,但如果需要,我也可以指定ICartItem.奇怪的是,因为C#只使用区域来阻止继承的属性,所以我似乎无法像在VB.NET中那样在C#中明确指定SKU的实现接口.

我的问题是:能否指定一个或另一个接口来实现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(); }
    }
}

这个类不会编译.在这种情况下,您无法显式定义ICartItem.SKU,因为ICartItem.SKU只是ISkuItem.SKU.没有“其他”SKU属性可供定义.

所以,直接回答你的问题:

Is there any importance behind being
able to specify one interface or
another to implement properites in
VB.NET?

当它们是分开的,不相关的接口时:是的.
正如其他人所指出的,您可以为共享通用名称的不同接口成员提供不同的实现.

但是当一个接口继承另一个接口时:没有.
这没关系,因为它们是一回事.

What is the effect of specifying one
interface over another when
implementing properites?

同样,如果它们是不相关的接口,它具有其他人已经讨论过的效果:为这两个接口提供不同的实现.但如果一个人从另一个人那里获得,它就没有效果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读