6

Vb.Net ではインターフェイスの動作が異なります。IStudent以下は、インターフェイスがSayHelloクラスによって実装されるメソッドを持つサンプル コード スニペットStudentです。のアクセス修飾子は、デフォルトでSayHelloある必要がありPublicます。Access修飾子をに変更しPrivateても既存のコードが壊れることはありませんが、以下のコードを使用してこのプライベートメソッドにアクセスできます

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

アクセス修飾子は、クラス内のメンバーのスコープを決定します。さらに、プライベート メンバーは、存在するクラスからのみアクセスできます。しかし、ここで Access Modifier の理論である Encapsulation が壊れています。

  • なぜ .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
4

5 に答える 5

4

元の投稿者は、TheBugGuys@Coverity.com 経由でこの質問を私に送信してくれました。私の答えはここにあります:

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

簡単に要約すると:

.NET がこのように設計されたのはなぜですか?

その質問はありえないほど漠然としています。

C# と VB での明示的な実装によってカプセル化が壊れていますか?

メソッドのプライバシーは、誰がメソッドを呼び出せるかではなく、メソッドnameのアクセシビリティ ドメインを制限します。クラスの作成者が、プライベート メソッドを名前で検索する以外のメカニズムによって呼び出し可能にすることを選択した場合、それは彼らの選択です。第三者は、カプセル化を破るプライベート リフレクションなどの手法を使用しない限り、それらを選択することはできません。

この機能は .NET でどのように実装されていますか?

明示的なインターフェイスの実装のための特別なメタデータ テーブルがあります。CLR は、どのクラス (または構造体) メソッドがどのインターフェイス メソッドに関連付けられているかを判断しようとするときに、最初にそれを参照します。

于 2013-10-09T15:42:17.237 に答える
3

C# と VB.NET の間に根本的な違いはありません。あいまいさを解決するために異なる方法を選択しただけです。C# スニペットで最もよく示されています。

interface ICowboy {
    void Draw();
}
interface IPainter {
    void Draw();
}

class CowboyPainter : ICowboy, IPainter {
    void ICowboy.Draw() { useGun(); }
    void IPainter.Draw() { useBrush(); }
    // etc...
}

VB.NET は一貫したインターフェイス実装構文を選択しただけなので、プログラマは暗黙的実装構文と明示的実装構文の違いを比較検討する必要がありません。VB.NET では常に明示的です。

インターフェイス メソッドのアクセシビリティのみが重要です。常に公開。

于 2013-09-18T19:06:54.020 に答える
2

変数 stdnt が IStudent として宣言されると、インターフェイス メソッドとプロパティが Public になるため、派生クラス (Student) の実装が実行されます。一方、stdnt が Student として宣言されている場合、プライベート メンバー (Name および SayHello) は実装されず、エラーがスローされます。

Interface メンバーのスタブ (Name & SayHello) はデフォルトで Public であり、派生クラスの実装のアクセス修飾子定義は無視されると思います。

私見では。

于 2015-10-21T19:13:04.323 に答える
1

C# での正確な等価物は次のとおりです。インターフェイス型のオブジェクトで使用できるメソッドと、そうでない場合に使用できるプライベート メソッドです。

   void IStudent.SayHello()
   {
       this.SayHello();
   }
   private void SayHello()
   {
       Console.WriteLine("Say Hello!");
   }
于 2013-09-18T18:51:43.987 に答える