VB.NETでは、インターフェイスのメソッドを実装するとき、

Privateアクセス修飾子を適用できます(下記リスト8行目を参照)。

1 Interface IHoge
2  Sub method()
3 End Interface
4
5 Class Foo
6  Implements IHoge
7
8  Private Sub method() Implements IHoge.method
9   Debug.WriteLine(”call method()”)
10  End Sub
11 End Class
12
13 Module Module1
14  Sub Main()
15   Dim obj As New Foo
16   ’obj.method() ’ Privateアクセスのため呼び出せない
17   Dim iobj As IHoge = New Foo
18   iobj.method() ’インターフェイス経由ならアクセス可
19  End Sub
20 End Module

私のJavaの経験上、これは非常に不自然に感じます。
VB.NETでは、このようにできる仕様に何の意味があるのか、
どのようなとき役に立つのか、教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:kazuki12112005 No.1

回答回数16ベストアンサー獲得回数0

ポイント5pt

http://ruffnex.oc.to/ipusiron/cgi/forum/patio.cgi

質問掲示板@Security Akademeia

ここと、

ここに、いけば、大体わかると思いますよ


ペコリ(o_ _)o))

id:ngc02 No.2

回答回数108ベストアンサー獲得回数2

ポイント45pt

MSDN(2.0)には、


クラスは、プロパティおよびプロシージャを Private (Visual Basic) で実装できますが、そうするとクラスのインスタンスをインターフェイスの型で宣言した変数にキャストしない限り、これらのメンバにアクセスできなくなります。


と書かれています。一応アクセスできるのでアリかな?

まあ普通使うことは無いと思うけど

MSDN(1.0,1.1)にはこう書かれています、


インターフェイスを実装するときは、インターフェイスで宣言されたメンバをすべて実装する必要があります。メンバのいずれかを省略すると、構文エラーと見なされます。クラスは、プロパティおよびメソッドの Private 実装を使用できますが、これらのメンバにアクセスするには、実装元クラスのインスタンスをインターフェイスの型で宣言した変数にキャストする以外に方法はありません。

id:witt

なるほど。VB.NETのMSDNにも明確な答えがないのですね

(あるのは仕様説明のみ)。

自己レスになりますが、本機能はC#適に言うと、

「インターフェイス メンバの明示的実装」と言うみたいです。

http://www.microsoft.com/japan/msdn/library/default.asp?url=...

>場合によっては、インターフェイス メンバの名前が、

>インターフェイス メンバを実装するクラスに適していないことがあります。

>そのような場合は、インターフェイス メンバの明示的実装を使用して

>インターフェイス メンバを実装できます。

つまり、インターフェイスのメソッドを実装するのにコーディングが

少なくて済むクラスが存在するのだけれど、そのクラスの意味的に

そのメソッドが存在するのは違和感がある場合、クラスとして

そのメソッドが使えないようにPrivateするってことでしょうか。

2006/02/14 20:23:10
  • id:ngc02
    たとえばIEnumerable(Of T)を実装するときに必要。

    Public Function GetEnumerator() As IEnumerator(Of T) Implements IEnumerable(Of T).GetEnumerator
    :
    End Function

    Private Function GetEnumerator1() As IEnumerator Implements IEnumerable.GetEnumerator
    :
    End Function

    この機能がないとGetEnumerator1()にアクセスできてしまう。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません