初級講座46 クラスの作成でコンストラクタ変数宣言

タグの編集
投稿者 特急まっさーの父@初心者  (社会人) 投稿日時 2010/2/6 19:41:16
はじめまして。
クラス学習初心者、特急まっさーの父です。
お世話になります。


以下、コンストラクタの内部、コンストラクタを呼び出す側で、
引数のやりとりがどうなっているのか
ご教示下さい。


http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard46.htm
にて、下記リスト10、リスト11が質問対象です。



■リスト10:DownloadCommanderクラスのプログラム。コンストラクタの実装。

Public Class DownloadCommander

 (中略)
    Dim wc As Net.WebClient = New Net.WebClient()

    Public FolderName As String
    Public LogFileName As String

    '■コンストラクタ
    ''' <param name="Folder">ダウンロードしたファイルの保存先フォルダ</param>
    ''' <param name="LogFile">ダウンロード履歴を記録するファイル</param>
    Public Sub New(ByVal Folder As String, ByVal LogFile As String)

        Me.FolderName = Folder
        Me.LogFileName = LogFile

    End Sub
 (後略)



■リスト11:フォーム側のプログラム。新しいコンストラクタとDownloadメソッドの呼び出し。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 (中略)

    Dim Commander As New DownloadCommander(Folder, LogFileName)

    Commander.Download(URL)

 (後略)



この、リスト10の
        Me.FolderName = Folder
がよくわからないのです。


右側の Folder は、おそらく
コンストラクタ呼び出し側で指定した
    Dim Commander As New DownloadCommander(Folder, LogFileName)
の Folder だと思います。

Me.FolderName は、何を表しているでしょうか? 

Me.FolderName が、クラス定義の最初で宣言している

   Public FolderName As String
であるならば、
  Private FolderName As String
と宣言しても差し支えない様に思います。
Public でなければならない理由がよくわかりません。

Public でないといけないとすれば、
外部から直接、FolderName を操作している箇所がある様に思います。
それはどこでしょうか?

(説明は、FolderName についてさせて頂きましたが、
 LogFileについても全く同じです)

以上、宜しくお願いいたします。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/2/6 20:04:49
> 右側の Folder は、おそらく
> コンストラクタ呼び出し側で指定した
>     Dim Commander As New DownloadCommander(Folder, LogFileName)
> の Folder だと思います。

その認識で正しいですよ。


> Me.FolderName は、何を表しているでしょうか? 

御明察のとおり、
> Me.FolderName が、クラス定義の最初で宣言している
>   Public FolderName As String
にあたります。


> であるならば、
>  Private FolderName As String
> と宣言しても差し支えない様に思います。
> Public でなければならない理由がよくわかりません。

動作上は、Private でも問題ありません。Public にした場合には、呼び出し側で
MsgBox( Commander.FolderName )
Commander.FolderName = Folder2
などとして、ダウンロード前にフォルダを変更することもできます。

もしも DownloadCommander クラスにおいて、外部から変数の内容を変更されないようにするなら、
Public ReadOnly FolderName As String
とすることで、読み取り専用のフィールドとすることもできます。


> 外部から直接、FolderName を操作している箇所がある様に思います。
> それはどこでしょうか?

リスト13がそれにあたります。もし、このフィールドが Private な場合、
利用側はリスト12の書き方をすることになります。
投稿者 特急まっさーの父@初心者  (社会人) 投稿日時 2010/2/6 21:48:14
魔界の仮面弁士様、ご回答、ありがとうございます。


>リスト13がそれにあたります。

    '▼山県有朋
    Commander.FolderName = "C:\Test"

の箇所ですね。すっきりいたしました。
今後とも宜しくお願いいたします。

投稿者 (削除されました)  () 投稿日時 2010/2/9 04:35:07
(削除されました)
投稿者 (削除されました)  () 投稿日時 2010/2/9 04:41:23
(削除されました)
投稿者 (削除されました)  () 投稿日時 2010/2/9 05:26:15
(削除されました)
投稿者 (削除されました)  () 投稿日時 2010/2/9 05:32:29
(削除されました)
投稿者 (削除されました)  () 投稿日時 2010/2/9 06:09:25
(削除されました)
投稿者 (削除されました)  () 投稿日時 2010/2/9 06:40:19
(削除されました)