初心者のためのVB.NETの基本 ~クラス編~

####はじめに
初心者向けに参考書の0章によくある感じのお話です。
が、教科書では御法度な感覚的表現を多用してます。

なお、VB.NETに限らずプログラミングのイロハ的な内容も含んでいます。

##クラスとインスタンス
クラスとインスタンスの関係は、しばしば設計図と製品に例えられます。クラスで規定したプロパティやメソッド等に、具体的な値を与えて実体とするのがインスタンスです。

ちょっとよく分かりませんね。それぞれもう少し掘り下げて見ましょう！

###クラスとは

```
Class Student
  Private Name As String
  Public Sub Kansu()
  End Sub
End Class
```

上のコードのように、"Class Student"から"End Class"までで囲まれている部分がクラスの範囲です。ちなみにStudentというのはこのクラスの名前です。

クラスの中にはNameのような変数やKansu()のような関数が定義されます。これらの変数、関数などの適用範囲についてはPrivateなどアクセス装飾子によって決められています。アクセス装飾子についてはこちらを確認してください。


クラスはそれぞれ役割を持って作成されます。例えばFormクラスであれば、デザインで作られるGUI部分を記述します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410161/98e50a82-ec2c-529c-45fd-a263e9e152ab.png" width=60%>

上のような電卓を作成しようと思ったときに、ボタンそのものをFormのデザイン上に配置はデザインで行いますが、"2"のボタンを押した時に合計が表示される場所に"2"を表示する、というのはFormクラスに記述します。

その一方で、電卓の肝になる計算機能に関する記述などはForm以外にクラスを作成（別ファイルに作成することが多いかと思います）してそちらに行いましょう。


####各クラスの大まかな役割について

上記でも説明したFormクラスに関しては、デザインに伴う視覚的な部分を記述します。大雑把にクラスを分けると、見た目に関するものと、計算をしたりデータとのやり取りを行うなど複雑な処理を行うものとに二分できます。ここでは便宜的に視覚クラスと計算クラス、と書きますね。

視覚クラスの役割はその名の通り、処理の結果を目に見えるようにすることです。一方の計算クラスの役割もそのままですが、複雑な計算などの処理を行うことです。

つまり、計算は計算クラスで行って、その結果を視覚クラスに渡すわけです！言ってみれば視覚クラスは主役で、計算クラスは裏方みたいな関係性ですね。

こうすることによって何かエラーが生じた時にも原因が明確になるし、コードの見た目にも理解しやすくなります。

完全に感覚的な表現ですが、なにか記述する際には計算クラスに複雑な関数をばーっと作っておいて、それを使いたいよーって視覚クラスがいれば勝手に使ってねーといったイメージでしょうか。



###インスタンスとは

突然ですが、

VB.NETではクラスのあとにプロパティやメソッドを.（ドット）繋ぎで連ねて記述することができます。

```
Private Number As Integer
string1 = Number.ToString
```

上記のコードはinteger型のNumber変数を、ToStringメソッドを使ってString型に改めたものをstring1という変数に代入しています。

NumberのあとにToSringメソッドを繋げることができるのは、Numberの型のIntegerクラスがToStringメソッドを定義しているからです。



![ドット繋ぎ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410161/54328bc3-5b6b-edbc-5ee5-a83144571693.png)

その表れとして、Visual Studioを使用している方であれば、上図のように変数名のあとに.を付けるとその変数が使うことのできるメソッドやプロパティが表示されます。

#####余談ですが
>NumberのあとにToSringメソッドを繋げることができるのは、Numberの型のIntegerクラスがToStringメソッドを定義しているからです。

とさらっと書きましたが、これまでIntegerをはじめ〇〇型と呼んでいたものたちはクラスのことです。詳細は適当にぐぐってもらいたいのですが、自分で定義してないのに使えるクラスやメソッド、プロパティというのは.NET側で予め用意されたクラスの中に記述されているから使用できるんです。これが継承の効果です。頭の片隅にでも入れておいてください。


さて、話を戻します。

>計算クラスに複雑な関数をばーっと作っておいて、それを使いたいよーって視覚クラスがいれば勝手に使ってねー

基本的に計算クラスで小難しい処理は記述しておいて、視覚クラスではその処理の結果を表示する。役割分担をしようね、という話でした。

ただ計算クラスと視覚クラスでは当然ながらクラスが分かれています。Publicなどのアクセス装飾子の話は別として、他クラスのメソッドやプロパティはさきほどの.繋ぎを使おうとしても使えません。計算クラスで渾身の力作メソッドを記述したとしても、そのままでは視覚クラスで使えないわけです。


そこでお待たせしました、ここで使用するのがインスタンスです！

```
Private Array As New ArrayList()
```

上記の例ではArrayListクラスをインスタンス化をして、Arrayという変数を定義しています。

視覚クラスで計算クラスのメソッドを使用したいなら

```
Private 計算インスタンス As New 計算クラス
計算インスタンス.使用したいメソッド名()
```

として計算クラスのインスタンスを定義してあげれば、視覚クラス内で堂々と計算クラス傘下のメソッドやらプロパティやらを使えるわけですな。




##リファレンス
初心者はもちろん、玄人の皆さんも参照されていること必至のリンク群です。

[DOBON.NET](https://dobon.net/vb/dotnet/index.html)
具体的に豊富な単元について解説されています。.NETを書く人なら一度はお世話になっていそうな有名なサイト。

[総武ソフトウェア推進所](https://smdn.jp/programming/netfx/)
各単元について深く掘り下げて解説してくれます。いつもお世話になってます！

[Microsoft公式](https://docs.microsoft.com/ja-jp/dotnet/#pivot=docs&panel=dotnetguides)
困ったときは公式に当たるのが定石らしい。

[VisualBasic中学校](http://rucio.o.oo7.jp/main/main.htm)、[VB図解](http://rucio.a.la9.jp/main/kiso/index_kiso.htm)
こちらも単元ごとにていねいに解説されています。

[未確認飛行C](https://ufcpp.net/)
VB.NETにフォーカスしていないものの、参考になる部分も多そうです。