大復活C#学習準備_5
C#が新しい言語だといってもすでに開発から20年近くたっている。本屋に行ってみると棚にはたくさんの本が並んでいるが、ITやプログラミング関連ではスマートフォン(Android)の使い方やエクセル入門と並んでPython関連の学習本が圧倒的な存在感を示している。CやC++の本も少しは見つけることが出来るが、C#についてはきわめて少ない。
Pythonがブームなのは機械学習に容易にチャレンジできるからだろう。C#やSwiftもPython同様にオブジェクト指向言語なのに人気がないのは難解だからに違いない。
手に入れた古本や「超」入門を拾い読みしてみると、たしかに難解だ。オブジェクト指向プログラミング言語は以下の3つの特性を供えている、という。
・カプセル化(データの隠蔽)
・継承
これをオブジェクト指向プログラミングの三本柱という。他の言語の入門書の第1章でいままでこの単語に遭遇した記憶がない。初心者は解説書の最初に書いてあるこの3項目を目にするだけで怖気づいてしまう。意味がわからないからだ。すでにこの瞬間に挫折してしまうのが目に見えるようだ。
少しだけ本を読んで感じたのは、変数やデータ型、演算子、制御文、配列など、他の言語やアプリケーションとほとんど違わないように思える。方言の違いくらいだろうか。
三本柱が難解だ。
本質は、クラスとオブジェクトにあるように直観する。
クラスとオブジェクトを理解するために、はじめはメイン(Main( ))だけのクラスを作って理解を深めたい。
遊び心をくすぐる時刻表示のプロジェクトを書いてみた(出典は「猫でもわかるC#プログラミング(初版)」、2007年)。
名前空間は ClockSample。
クラスは clockSampleのみで、メソッドはMain( )のみ。Main( )にはstatic とpublic が付いている。
コンソールへの表示コードはただ本の記載をまる写しただけだ(これについては、ここでは勉強しない、ただの受け売りで済ませる。いずれGUIで学習する予定)。見た目は一見、まがまがしいが、内容はいたって単純な、制御文if elseだけのプロジェクトだ。
パソコンの画面左上に時刻を表示する小さなウインドウが開く。何かのキーを押すと消える。
学習】ここではClockSampleというフォルダ(プログラムの保存場所)にclockSampleという名前のクラス(class)が作られた。画面右端のソリューションエクスプローラに表示されている(スクリーンセーバによって撮った写真を参照)。
C#によるアプリケーションの開発には「Microsoft Visual Studio」を使用している。Visual Studioにおいてアプリケーションは「プロジェクト」という単位で管理される。プロジェクトの中には、そのアプリケーションで必要となるクラスのファイルが生成される。
通常システムは複数のアプリケーションやクラスライブラリから構成され、複数のプロジェクトを集めて「ソリューション」という単位で管理される。
プロジェクトを作成すると「Program.cs」というファイルが生成され、プログラムで使用するプログラムのファイル、テキストファイル、画像ファイルなどが一覧形式でここに表示される。
カプセル化:通常変数はアクセス修飾子(publicやprivateなど)を使って他のクラスからクラス内部のメンバにアクセスできるかどうかを決めている。カプセル化とは隠蔽を意味する。外からメンバ変数におかしな値を入れられないようにして、利用してほしい機能だけを使えるようにするのが目的である。
public :すべてのクラスからアクセス可能
private :自分のクラス以外からはアクセス不可能
protected :自分のクラスまたは派生クラスからのみアクセス可能
アクセス修飾子は通常、変数の定義やメッソドの定義の先頭に記載する。
public int bodyWeight ; // 体重の定義
private sti hisName ; // 彼の名前
オブジェクト指向では、仕組みが見えなくても希望する処理が行えるようにすることを隠蔽化(カプセル化)という。「中身(内部実装)がどうなっているかを隠蔽し、可能な操作と属性(外部仕様)のみを公表する」という思想があり、この”可能な操作”をメソッド(method)、”属性”のことをプロパティ(property)という。上記の、アクセス修飾子による制限もカプセル化の一例である。
継承:クラス間で重複している部分を取り出して新しいクラスを作り、プログラムの重複をなくす仕組み。
継承を使ったクラスの書き方
class 派生クラス:基本クラス
{
// ここにメソッドなどを書く
}
継承したメソッドの一部を変更したい場合はメソッドオーバーライドを用いる(後述)。基本クラスのメソッドにvirtual キーワード、派生クラスのメソッドにoverrideキーワードをつける(後述)。
次回は、ここで示した事項をクラスとオブジェクト(インスタンス)を絡めて学びたい。
例】クラスの継承を作ってみる。初めてなので、誤りは後程訂正する予定(習うより慣れよぉ!)。
コンストラクタの訓練
(続き)
プログラムのメイン部分は以下。
学習】現在理解している手順について略記しておく。
1.クラス(class)でインスタンス(オブジェクト)を作成するときは最初にclass名と同じコンストラクタ(建設者の意味)を記載する。自分でコンストラクタを記載していない場合にはコンパイラが自動で引数も処理もないデフォルトコンストラクタを生成している。自分でコンストラクタを記載した場合はデフォルトコンストラクタは生成されない。できればコンストラクタを作成する際には( )にこれから用いる変数を定義しておいた方がよい。またコンストラクタを宣言する前に引数の型定義(intやstrやdoubleなど)を行っておく。
コンストラクタとはクラスがインスタンス作成時に一度だけ実行したい処理(クラスの初期化処理など)を定義することである。先の「時計」のプロジェクトには記載がない。「お年玉」では14行目がコンストラクタだ。
(記載例)
class Sample //これがコンストラクタのもととなるクラス
{
public string name;
public int age;
publiac double number;
// 次の行がコンストラクタを表す
public Sample←class名と同じ名前する(string name,int age, doublr number )
{
//ここに引数の初期値やメソッドを記載する。
}
}
2.Main()メソッドを実行するclassには、そのプロジェクトの最終結果を表示する内容をコードする。変数定義にはこれから行う内容で使用する基本となる変数(名前や数値や住所など)や定数(倍率など)を記載しておく。原則としてこの学習中は変数の宣言はすべてpublicにしておきエラーが生じないようにする。(追記:例外として、set、getを用いたプロパティではprivateを用いる)
3.Main( )メソッドのclassにメソッドを返すために新たに”ファイル内に追加したclass”(とりあえず「子クラス」と呼ぶことにしておく。正式名がわかれば訂正する)にはたくさんのメソッドは記載せず2ないし3本位にとどめる。Main( )メソッドのあるclassにはコンストラクタによって子クラスの基本クラスから作成した派生クラスを用いてメソッドを記載して結果を表示する。
記載例)派生クラスの作り方
Sample newSample = new Sample(); //newSampleが派生クラスとして作られる
とりあえず、ここまでが現在のところ理解している、クラス、インスタンス、コンストラクタの内容だ。もう少しレベルが上がったらもっと手順として整理したい。
クラスは入れ物、オブジェクトは鋳型、鋳型を使ったできあがったものがインスタンスという理解だろう(未熟なので間違っていたら、ごめんなさいです)。