投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/9/1 22:59:07
> New 項 という設定
項 (こう) ではなく
頁 (ページ) ですね。


> クラスって自由に作れて内容を定義してあげればエラーが出ずに動くんですね
その「作成」「定義」を行っていくのが、プログラミングという作業です。


> クラスは設定みたいなものなのかなとおもいました。
設計図、と言えるかもしれません。

たとえば【住所録】のクラスを作るなら、そこにどんな情報を管理するのか整理し、
それは数値なのか文字列なのかを定め、項目や制限などを組み込んでいったりします。


項目は、クラスでいえばフィールド変数やプロパティに当たります。
制限というのは処理の振る舞いのことで、プロパティの入力値検査や、メソッド・関数として実装します。

【住所録】のクラスなら、こういった振る舞いを組み込むことができるでしょう。
 🔶 氏名 🔶 氏名に空欄を許可するのか? 必須入力とするのか?
         後から姓を変更することを許可するか? 許可するなら旧姓も管理するのか?
         外国人用にミドルネームやスペルも管理できるようにするか?
         
 🔶 性別 🔶 男・女だけで良いのか? 性別不明も許可するのか?

 🔶生年月日🔶 これから生まれる予定の子供の未来日付の入力を許可するか?



> Public Class 名簿
【名簿】クラスの宣言です。


>  Inherits List(Of 頁)
一冊の名簿には、複数のページ情報がありますよね。

複数のデータを管理する機能を、すべて自作するのは面倒なので、
既存の System.Collections.Generic.List(Of ) というコレクション クラスを流用して、
その機能を受け継がせています。これを、クラスの「継承(inherits)」と言います。


>  Public Property 標題 As String
名簿クラスに、「標題」という インスタンス プロパティを定義する宣言です。
標題は、文字列型(String)として宣言しています。


>  Public Sub New(標題 As String)
>   Me.標題 = 標題
>  End Sub
名簿クラスのインスタンスを生成する際には、「標題」情報を必須としたいので、
Sub New で示される「コンストラクタ(constructor)」で、標題を受け取るようにしています。

引数(パラメーター)で受け取った情報は、先ほど作った、自身の「標題」プロパティに
代入して保存します。『Me.標題 = 標題』の部分ですね。


>  Public Overloads Sub Add(姓 As String, 名 As String, Optional 生年月日 As Date? = Nothing)
>   Add(New 頁() With {.姓 = 姓, .名 = 名, .生年月日 = 生年月日})
>  End Sub
List(Of 頁) クラスは、標準で Add という処理を持ち合わせています。

List(Of 頁) クラスに標準で用意されている Add メソッドは
  b.Add( 新しい頁 )
という定義しか無かったわけですが、そこに
  b.Add( 苗字, 名前 )
  b.Add( 苗字, 名前, 生年月日 )
のような呼び出し方も行えるようにしたものがこの宣言です。


このように、パラメーター定義だけが異なる同じ名前のメソッドのことを、
メソッドの「オーバーロード(多重定義)」と言います。
『Public Overloads Sub Add(…』の "Overloads" の部分のことですね。


もし、上記の Public Overloads Sub Add~~End Sub のブロックが無かった場合は、
  Dim b As New 名簿("3年B組(平成22年度)")
  b.Add("荒井", "駿")
  b.Add("井坂", "碧")
という呼び出しの代わりに、標準の Add メソッドを用いてこのように書きます。
  Dim b As New 名簿("3年B組(平成22年度)")
  b.Add(New 名簿.頁() With { .姓 = "荒井", 名 = "駿" })
  b.Add(New 名簿.頁() With { .姓 = "井坂", 名 = "碧" })


>  Public Class 頁
>   Public Property 姓 As String
>   Public Property 名 As String
>   Public Property 生年月日 As Date?
>  End Class
先程の【名簿】クラスの宣言と同様に、
ここでは【頁】クラスの宣言が行われています。

見ての通り、3 つのメンバーが定義されており、それぞれ
  文字列型(String 型)の「姓」というプロパティ
  文字列型(String 型)の「名」というプロパティ
  Null許容日付型(Date? 型)の「生年月日」というプロパティ
という定義となっています。


> End Class
これは最初の『Public Class 名簿』の終端を意味します。

【名簿】と【頁】、2 つのクラス定義を並べて
Public Class 名簿
'    : 
End Class
Public Class 頁
'    : 
End Class

と書いても良いのですが、それが名簿の頁であることが明確となるよう、先の例では
Public Class 名簿
      :
    Public Class 頁
        :
    End Class
End Class

のような、入れ子の階層構造で定義してみました。