【问题标题】:VB equivalent of C# interface behaviourVB 等效于 C# 接口行为
【发布时间】:2013-10-05 05:33:10
【问题描述】:

在 C# 中,可以解决这个问题:

interface IImpliedReadOnly
{
    int SomeNumber { get; }
}

class Implementation : IImpliedReadOnly
{
    private int someNumber = 0;

    public int SomeNumber
    {
        get { return this.someNumber; }
        set { this.someNumber = value; }
    }
}

但我在 VB 中找不到等效的方法。 如果我在接口 ReadOnly 中设置属性,则实现类必须匹配这些访问权限并将该属性声明为 ReadOnly,而不是像在 C# 中那样实现 getter 和 setter。

有没有办法解决这个问题? 如果没有,为什么 VB 不允许呢?

【问题讨论】:

    标签: c# .net vb.net


    【解决方案1】:

    您的代码在 C# 中工作,因为 C# 支持隐式接口实现,VB.NET 仅支持显式接口实现。

    如果您使用显式接口实现来实现您的 C# 示例的以下改编,您将收到以下错误:

    代码:

    interface IImpliedReadOnly
    {
        int SomeNumber { get; }
    }
    class Implementation : IImpliedReadOnly
    {
        private int someNumber = 0;
        int IImpliedReadOnly.SomeNumber
        {
            get { return someNumber; }
            set { someNumber = value; }
        }
    }
    

    错误:

    错误 1 ​​'Test.IImpliedReadOnly.SomeNumber.set' 添加了一个访问器而不是 在接口成员'Test.IImpliedReadOnly.SomeNumber'中找到

    【讨论】:

    • @Pharap 是的,这不是您的代码。我想向您展示,如果您使用显式接口实现,C# 和 VB.NET 的行为方式是相同的。
    【解决方案2】:

    其实可以使用下面的VB代码:

    Friend Interface IImpliedReadOnly
        ReadOnly Property SomeNumber() As Integer
    End Interface
    
    Friend Class Implementation
        Implements IImpliedReadOnly
    
        Private someNumber_Renamed As Integer = 0
        Private ReadOnly Property IImpliedReadOnly_SomeNumber() As Integer Implements IImpliedReadOnly.SomeNumber
            Get
                Return SomeNumber
            End Get
        End Property
        Public Property SomeNumber() As Integer
            Get
                Return someNumber_Renamed
            End Get
            Set(ByVal value As Integer)
                someNumber_Renamed=value
            End Set
        End Property
    End Class
    

    【讨论】:

      【解决方案3】:

      现在试试这个……

      Interface IImpliedReadOnly
      ReadOnly Property SomeNumber() As Integer
      End Interface
      Class Implementation
      Implements IImpliedReadOnly
      Private m_someNumber As Integer = 0
      Public Property SomeNumber() As Integer Implements IImpliedReadOnly.SomeNumber
          Get
              Return m_someNumber
          End Get
          Set
              m_someNumber = value
          End Set
      End Property
      End Class
      

      【讨论】:

      • 把 Return 1 换成 Return m_someNumber
      • @Rony:你所做的只是证明了 Pharap 提出的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多