class自体のPrivateなどの修飾子の意味

解決


MenPin  2005-09-08 21:26:17  No: 125052  IP: [192.*.*.*]

クラスのフィールドやメンバのアクセス修飾子の意味は分かりやすく解説してあるサイトとかで勉強して理解できたのですが、

Private class clsA
・・・

のようなクラス自体のアクセス修飾子の意味が分かりません><
ヘルプを見たのですが「エンティティ」とか難しい単語が出てきて理解できませんでした。
ので分かりやすい解説を希望します。または、分かりやすい解説が載ってるHPを紹介してください。よろしくお願いします。

編集 削除
MenPin  2005-09-08 21:31:00  No: 125053  IP: [192.*.*.*]

エンティティを検索で調べたのですが、それでもやっぱりヘルプの意味は理解できませんでした。図解のサイトがあれば理解しやすいのですが・・・オブジジェクト指向はなかなか手ごわいですね><

編集 削除
特攻隊長まるるう  2005-09-09 08:54:39  No: 125054  IP: [192.*.*.*]

…エンティティ…出てくるのかなぁ?XML とか Java ならともかく…???
[アクセシビリティ]
http://www.microsoft.com/japan/msdn/library/ja/vbcn7/html/vbconaccessibility.asp

編集 削除
さるべーじ  2005-09-09 10:45:58  No: 125055  IP: [192.*.*.*]

Visual Basic 言語の仕様 - 4.6 アクセスの種類
    http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcn7/html/vbconaccessibility.asp

あたりで出てきますね。エンティティ。

VB.NETの場合、言語仕様がかなりユルいので、
「オブジェクト指向プログラミング(OOP)をこれから学ぶために使うツール」
としてはかなり厳しいものがあります。
VB.NETは、OOPもやろうと思えばできますが、そんなもん気にしなくても
動くものを作れちゃうので、誤解しても気づきにくいんですよね。

学習目的であれば、OOPから逸脱しにくいC#のほうが実はお勧めだったり。

で、上記URLの説明であれば、

    エンティティ              →  (クラスなどの)定義
    アクセシビリティ          →  使用できる有効範囲
    アクセシビリティドメイン  →  使用できる有効範囲

※ ちょっと古い資料だと、アクセシビリティ→スコープと言っていたりします。

くらいに読み替えると、なんとなく意味が伝わってきます。
もちろん厳密に説明すると妙に難しい話になりますが、
おおまかに理解したいならこんな感じでも十分イケます。

で、実際に上記URLのサンプルコードを組んで、
どこから使えるのか使えないのかを、
思いつく限りやってみることをお勧めします。
「使えるはず」「使えないはず」「実際使えた」「実際使えなかった」を
繰り返していくうちに、身に染み込んでいきますから。

文章だけ読んでわかった気になっても、独習では誤解に気づきにくいです。
他の一般的な勉強にくらべて、プログラミングは自分の理解を
実際に確認できるツールがありますので、がんがん検証しましょう。

がんばってくださいね。

編集 削除
MenPin  2005-09-09 11:03:23  No: 125056  IP: [192.*.*.*]

レスありがとうございます。
なんとなく理解できたようなそうでないような・・・

クラスを定義しようとしてPublic,Friendは定義できましたが
Private,Protectedは定義しようとすると、型やクラスの内部にしか
定義できませんと表示されました。

ということはPrivate,Protectedはクラスの中に入れ子のようにして
クラス定義するときに使うのでしょうか?(そんなことできるの?

ますます謎が深まってしまいました><

編集 削除
特攻隊長まるるう  2005-09-09 11:21:38  No: 125057  IP: [192.*.*.*]

>クラスを定義しようとしてPublic,Friendは定義できましたが
>Private,Protectedは定義しようとすると、型やクラスの内部にしか
>定義できませんと表示されました。
Private は他のクラスから見えないんだから、どこからもインスタンスを
生成してやれない→どこからも使われない…で意味がないからクラスに適用
できないんでしょうね。クラスに適用する時点でおかしいです。
Protected も同一クラスから見えるのは当然として、派生クラス…つまり
継承先でしか見えないという特性を考えると、クラスに適用できたらマズい
ですね。『継承』について調べてみて下さい。

[Visual Basic 言語の仕様 - 4.6 アクセスの種類]
http://www.microsoft.com/japan/msdn/library/ja/vbls7/html/vblrfvbspec4_5.asp
リンク先が違うみたいなので修正。

編集 削除
特攻隊長まるるう  2005-09-09 11:25:13  No: 125058  IP: [192.*.*.*]

スコープを含めた図解があったので参考リンク
[Visual Basic 図解 基礎解説]
http://homepage1.nifty.com/rucio/main/kiso/Scope.htm

編集 削除
さるべーじ  2005-09-09 11:39:44  No: 125059  IP: [192.*.*.*]

> リンク先が違うみたいなので修正。

しまったー!
特攻隊長まるるうさん、フォローありがとぅございます。m(_ _)m

編集 削除
MenPin  2005-09-09 11:42:26  No: 125060  IP: [192.*.*.*]

試行錯誤で色々試してみたところクラスは入れ子にして定義することが出来ることがわかりました。
入れ子にした内部のクラスには他のフィールドやメソッドと同じようにアクセス修飾子を付ける事ができました。

問題は一番外側のモジュールレベルのクラス定義に付けるアクセス修飾子なのですが、PublicとFriendしか付けれませんので予想では、Friendが同じプロジェクト内でアクセス可能で、Publicが他のプロジェクトからでもアクセス可能になると予想しました。

それを検証するために現在開いているソリューションに新しくプロジェクトを追加してみました。
そして新しいプロジェクトで元のプロジェクトのPublic,Friend,無し,のクラスを参照しようとしましたが出来ませんでした。

そこで、他のプロジェクトからアクセスできるできないというのは間違いで、同じプロジェクトの他のクラスファイルからアクセスできるできないなのではないかと予想しました。

それを検証するために元のプロジェクトに新しいクラスファイルを追加しました。そして元のクラスファイル(formファイル)のPublic,Friend,無し,のクラスを参照しようとしたら今度は全部参照できてしまいました。

この予想も間違いみたいでした><
いったいモジュールレベルのPublicとFriendの違いは何なのか分からなくなってしまいました。

やっぱり他のプロジェクトから参照できるという予想が正しくて、参照するにはなにか設定しなければならないことがあるのでしょうか?
わかるかた教えて下さい。お願いします。

編集 削除
特攻隊長まるるう  2005-09-09 11:54:07  No: 125061  IP: [192.*.*.*]

>それを検証するために現在開いているソリューションに新しくプロジェクトを追加してみました。
>そして新しいプロジェクトで元のプロジェクトのPublic,Friend,無し,のクラスを参照しようとしましたが出来ませんでした。
ここで必要な手順があります。
AプロジェクトからBプロジェクトを見るためには、1度ビルドし、
Aプロジェクトの参照設定でBプロジェクトの参照を追加してやる必要があります。
ダイアログで[プロジェクト]タブを選び、Bプロジェクトの参照を追加してください。

編集 削除
MenPin  2005-09-09 12:02:24  No: 125062  IP: [192.*.*.*]

参照を追加できませんでしたdllを指定してくださいとでました。
exeのプロジェクトは参照できないのでしょうか?

編集 削除
特攻隊長まるるう  2005-09-09 12:07:10  No: 125063  IP: [192.*.*.*]

>exeのプロジェクトは参照できないのでしょうか?
ああ!、そうですね。プロジェクトのプロパティ画面から
[全般]-[出力の種類]をクラスライブラリにして下さい。

編集 削除
MenPin  2005-09-09 12:18:15  No: 125064  IP: [192.*.*.*]

出来ました!
他のプロジェクトからはFriendは見えずPublicは見えました
色々アドバイスありがとうございました。

編集 削除
MenPin  2005-09-09 12:20:58  No: 125065  IP: [192.*.*.*]

解決です

編集 削除
MenPin  2005-09-09 12:24:00  No: 125066  IP: [192.*.*.*]

PS. 一番外のアクセス修飾子ってPublicとFriendですけど、PublicとPrivateの方が直感的に分かりやすいと思うのですが・・・

編集 削除
MenPin  2005-09-09 12:30:21  No: 125067  IP: [192.*.*.*]

やっぱりPrivateだと継承する時に問題がありますね。Privateクラスの中のFriendメンバの意味もなくなりますし・・・

編集 削除
MenPin  2005-09-09 12:33:29  No: 125068  IP: [192.*.*.*]

う〜ん自分で言ってる意味が良く分からなくなってきた・・・
オブジェクト指向恐るべし><

編集 削除
特攻隊長まるるう  2005-09-09 12:40:24  No: 125069  IP: [192.*.*.*]

自分の基準をどこに置くかだねぇ。
自分をプロジェクトだと思うと Friend の概念は分からなくなります。
あくまで基本となるのはクラス単位であって、プロジェクトはクラスを
まとめたグループみたいなものです。
クラスを自分だと考えると自分自身を Private として、宣言したクラス
(自分)内しか見えない存在にする…って他を拒絶してると言うか、引きこも…
or 透明人間な感じ。

『継承』については過去ログでそれなりのサンプルも提供してますが。
過去ログ検索『継承』でどうぞ。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200408/04080006.txt
一番最後のサンプルコードで
>    Private BaseSalary As Single
みたいな使い方はどうでしょう?

編集 削除
MenPin  2005-09-09 12:53:28  No: 125070  IP: [192.*.*.*]

う〜ん自分が思ったのはPrivateでクラス定義したら、他のクラスは自分と同列にいるわけだからPrivateにしてても他のクラスから見れると思ったのです。(クラスの中のPrivateメンバがその同列のメンバからアクセスできるように)
間違ってたらスイマセン

編集 削除
MenPin  2005-09-09 12:59:57  No: 125071  IP: [192.*.*.*]

Friendクラスの中にPublicメンバを定義してもFriendとしてしか働かないけどエラーにはならないので、一番外をFriendとして定義しないでPrivateとして定義できたほうがやっぱり分かりやすいかもです

編集 削除
特攻隊長まるるう  2005-09-09 13:25:23  No: 125072  IP: [192.*.*.*]

>他のクラスは自分と同列にいるわけだから
同列だと分かる時点で自分は第三者の目線になっちゃってるよね?
同列であるように管理してるのは?…プロジェクトでは?。
自分がプロジェクトになってます。

説得しなきゃイケナイのかなぁ…個人のとらえ方は自由ですので
マイクロソフトがそう決めたって事で納得するしかないんですが。
…ボク自身は違和感ないし、MenPin さんとマイクロソフトの考え方が
合っていないという事でしょう。

一応だらだらと説明してみます。

自分はクラスです。自分を…

Friend にするって事は友達とメアドの交換をして
そのメアドからはメールを受け付けるって事です。
友達であればどんなメアドを持ってるか調べられます。
→つまり同じプロジェクトの下にあるっていうルールで受け付けます。

Public にするって事は公の掲示板とかにメアドを
公開していたずらメールも受け付けますって事です。
掲示板に接続できればメアドが手に入れられます。
→プログラムとして有効な手段を使えばどこからでも受け付けます。

Protected ってのは独自のメール受け取りシステムを
作って、その系統のシステムからの受け取りを許可する
って事です。
同じシステムの会員になれば会員のメアドを調べられます。
→同じ系統のクラスだというルールで受け付けます。

Private ってのは誰にもメアドを教えない…ってゆーか
直接WEBに接続しないって事です。
他にどんなメアドを持ってるユーザがいるか調べる手段は
ありません。
→自分しか見えません。

編集 削除
MenPin  2005-09-09 14:33:53  No: 125073  IP: [192.*.*.*]

Class clsA

  Private class clsB
    ・・・
  End class

  Friend class clsC
    Dim insB as New clsB <-- 同列からインスタンスを作成できる
    insB.xxx
  End class

End class

これは実際に動きます。これを1つ入れ子をはずしたバージョンで

Private class clsB
  ・・・
End class

Friend class clsC
  Dim insB as New clsB <-- 同列からインスタンスを作成できる
  insB.xxx
End class

のように定義できたらいいなーと思ったのです。

編集 削除
特攻隊長まるるう  2005-09-09 14:53:30  No: 125074  IP: [192.*.*.*]

…自分の隠し子を友達に知られたくない(ぉ
理に叶ってますよね?

編集 削除
MenPin  2005-09-09 18:11:36  No: 125075  IP: [192.*.*.*]

やっぱり良く考えたら同じプロジェクトからアクセスできるのはPrivateよりFriendの方が混乱がなくていいかもですね(クラスのメンバにFriend修飾子付けたときは同じプロジェクトからアクセスできるから)

特攻さんいろいろアドバイスありがとうございました

編集 削除