gpt4 book ai didi

vb.net - VB.Net 中的接口(interface)行为不同

转载 作者:行者123 更新时间:2023-12-04 13:27:30 29 4
gpt4 key购买 nike

接口(interface)在 Vb.Net 中的行为不同。下面是一个示例代码片段,其中 IStudent接口(interface)有一个方法SayHello由类 Student 实现. SayHello 的访问修饰符应该是 Public默认情况下。通过将访问修饰符更改为 Private没有破坏现有代码,我仍然可以使用下面的代码访问这个私有(private)方法

Dim stdnt As IStudent = New Student
stdnt.SayHello()

访问修饰符决定了类中成员的范围,更多的私有(private)成员只能从存在的类中访问。但是这里访问修饰符,封装的理论被打破了。
  • 为什么.net 是这样设计的?
  • Access修饰符和封装的概念真的被打破了吗?
  • .net 框架如何在内部处理这种情况?

  • 提前致谢
    Module Module1

    Sub Main()
    Dim stdnt As IStudent = New Student
    stdnt.Name = "vimal"
    stdnt.SayHello()
    End Sub

    End Module

    Public Interface IStudent

    Property Name As String

    Sub SayHello()

    End Interface

    Public Class Student
    Implements IStudent

    Private Property Name As String Implements IStudent.Name

    Private Sub SayHello() Implements IStudent.SayHello
    Console.WriteLine("Say Hello!")
    End Sub

    End Class

    最佳答案

    原始发帖人通过 TheBugGuys@Coverity.com 向我提交了这个问题;我的答案在这里:

    https://communities.coverity.com/blogs/development-testing-blog/2013/10/09/oct-9-posting-interface-behaves-differently-in-visual-basic

    简单总结一下:

    Why was .NET designed in this way?



    这个问题是不可能含糊的。

    Is encapsulation broken by explicit implementation in C# and VB?



    不,方法的隐私限制了方法名称的可访问域,而不是谁可以调用该方法。如果类的作者选择通过某种机制调用私有(private)方法,而不是通过名称查找,那是他们的选择。第三方无法为它们做出选择,除非通过诸如私有(private)反射之类的技术,这些技术确实破坏了封装。

    How is this feature implemented in .NET?



    有一个用于显式接口(interface)实现的特殊元数据表。当试图找出哪个类(或结构)方法与哪个接口(interface)方法相关联时,CLR 首先会查询它。

    关于vb.net - VB.Net 中的接口(interface)行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18879142/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com