Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Interface behavior is dfferent in VB.Net

Tags:

vb.net

Interface behaves differently in Vb.Net. Below is a sample code snippet where IStudent interface has a method SayHello which is implemented by a class Student. The Access modifier for SayHello should be Public by default. By changing Access modifier to Private is not breaking the existing code and still i can access this private method using below code

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

Access modifier determines the scope of the members in a class, more over private members are accessible only from the class which exists. But here the theory of Access Modifier, Encapsulation are broken.

  • Why .net has designed in this way?
  • Is the concept of Access modifier and encapsulation are really broken?
  • How .net framework internally handle this situation?

Thanks in advance

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
like image 444
Vimal CK Avatar asked Sep 18 '13 17:09

Vimal CK


1 Answers

The original poster submitted this question to me via [email protected]; my answer is here:

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

To briefly summarize:

Why was .NET designed in this way?

That question is impossibly vague.

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

No. The privacy of the method restricts the accessibility domain of the methods name, not who can call the method. If the author of the class chooses to make a private method callable by some mechanism other than looking it up by name, that is their choice. A third party cannot make the choice for them except via techniques such as private reflection, which do break encapsulation.

How is this feature implemented in .NET?

There is a special metadata table for explicit interface implementations. The CLR consults it first when attempting to figure out which class (or struct) method is associated with which interface method.

like image 157
Eric Lippert Avatar answered Sep 30 '22 19:09

Eric Lippert