今回は超入門からは少し高度かもしれませんが、オブジェクト指向プログラミングに欠くことが出来ない、クラスについて触れてみます。
そもそもクラスって???。
クラスとは?
うまく説明できませんが、変数と関数をまとめた物(オブジェクト)だと思っています。
クラスで使用する変数をプロパティ、関数をメソッドと言うようです。
クラスは仮想的に存在して、使用する時に実体化して使用します。
それをクラスのインスタンス化と言います。
今後、C#の開発を続けてオブジェクト指向的なプログラムを開発するのであれば必ず必要になってくると思います。
準備
前回まで使用したプロジェクトをVisual Studioを開いて今回に必要無い部分を削除します。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace testProjects { class Program { static void Main(string[] args) { // ここから // ここまで } } }
省いたらこんなコードになります。
既にクラスが使用されていてProgramというクラスが使用されています。
C#ではプロググラム内で必ず1つはクラスが必要というルールがあるようです。
では、このコードに新たなクラスを追加します。
クラスの宣言
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace testProjects { class Program { static void Main(string[] args) { // ここから // ここまで } } // クラスCar public class Car { } }
Carというクラス名でクラスを宣言しました。
まだクラス内には何も存在しません。
クラスに変数(プロパティ)を宣言
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace testProjects { class Program { static void Main(string[] args) { // ここから // ここまで } } public class Car { public string manufacturer; // メーカー public string carname; // 車名 public string color; // ボディ色 public int displacement; // 排気量 public int capacity; // 定員 } }
クラスにプロパティを5つ宣言しましたが、初期化もしていないし値も代入されていません。
クラスに変数(メソッド)を宣言
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace testProjects { class Program { static void Main(string[] args) { // ここから // ここまで } } public class Car { public string manufacturer; // メーカー public string carname; // 車名 public string color; // ボディ色 public int displacement; // 排気量 public int capacity; // 定員 // メーカーを代入する public void setmanufacturer(string paramanufacturer) { manufacturer = paramanufacturer; } // 車名を代入する public void setcarname(string paracarname) { carname = paracarname; } // ボディ色を代入する public void setcolor(string paracolor) { color = paracolor; } // 排気量を代入する public void setdisplacement(int paradisplacement) { displacement = paradisplacement; } // 定員を代入する public void setcapacity(int paracapacity) { capacity = paracapacity; } // メーカーを返す public string getmanufacturer() { return manufacturer; } // 車名を返す public string getcarname() { return carname; } // ボディ色を返す public string getcolor() { return color; } // 排気量を返す public int getdisplacement() { return displacement; } // 定員を返す public int getcapacity() { return capacity; } } }
プロパティに値を代入するメソッドとプロパティの値を戻すメソッドを作りました。
プロパティとメソッドを宣言しましたが、このままではこのクラスは使えません。
クラスを使用する準備をする必要があります。
クラスをインスタンス
クラスは宣言しただけでは仮想的に存在するだけで使用することができないので実体化して使用します。
その実体化をインスタンス化と言います。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace testProjects { class Program { static void Main(string[] args) { // ここから Car firstCar = new Car(); // ここまで } } // クラスCar public class Car { public string manufacturer; // メーカー public string carname; // 車名 public string color; // ボディ色 public int displacement; // 排気量 public int capacity; // 定員 // メーカーを代入する public void setmanufacturer(string paramanufacturer) { manufacturer = paramanufacturer; } // 車名を代入する public void setcarname(string paracarname) { carname = paracarname; } // ボディ色を代入する public void setcolor(string paracolor) { color = paracolor; } // 排気量を代入する public void setdisplacement(int paradisplacement) { displacement = paradisplacement; } // 定員を代入する public void setcapacity(int paracapacity) { capacity = paracapacity; } // メーカーを返す public string getmanufacturer() { return manufacturer; } // 車名を返す public string getcarname() { return carname; } // ボディ色を返す public string getcolor() { return color; } // 排気量を返す public int getdisplacement() { return displacement; } // 定員を返す public int getcapacity() { return capacity; } } }
Car firstCar = new Car();とインスタンス化して使用します。
では実際にCarクラスを使ったfirstCarを使ってみます。
クラスをインスタンス化して使う
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace testProjects { class Program { static void Main(string[] args) { // ここから Car firstCar = new Car(); // プロパティに値を代入する firstCar.setmanufacturer("トヨタ"); firstCar.setcarname("firstCar"); firstCar.setcolor("白"); firstCar.setdisplacement(3000); firstCar.setcapacity(7); // プロパティの値を表示する Console.WriteLine("メーカー:{0}", firstCar.getmanufacturer()); Console.WriteLine("車名 :{0}", firstCar.getcarname()); Console.WriteLine("ボディ色:{0}", firstCar.getcolor()); Console.WriteLine("排気量 :{0}", firstCar.getdisplacement()); Console.WriteLine("定員 :{0}", firstCar.getcapacity()); Console.ReadLine(); // ここまで } } // クラスCar public class Car { public string manufacturer; // メーカー public string carname; // 車名 public string color; // ボディ色 public int displacement; // 排気量 public int capacity; // 定員 // メーカーを代入する public void setmanufacturer(string paramanufacturer) { manufacturer = paramanufacturer; } // 車名を代入する public void setcarname(string paracarname) { carname = paracarname; } // ボディ色を代入する public void setcolor(string paracolor) { color = paracolor; } // 排気量を代入する public void setdisplacement(int paradisplacement) { displacement = paradisplacement; } // 定員を代入する public void setcapacity(int paracapacity) { capacity = paracapacity; } // メーカーを返す public string getmanufacturer() { return manufacturer; } // 車名を返す public string getcarname() { return carname; } // ボディ色を返す public string getcolor() { return color; } // 排気量を返す public int getdisplacement() { return displacement; } // 定員を返す public int getcapacity() { return capacity; } } }
ある家族の所有する車、firstCarの情報をプロパティに代入してコンソールに表示しました。
この家族がもう一台車を所有していると仮定します。
これもCarクラスを使って情報を操作します。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace testProjects { class Program { static void Main(string[] args) { // ここから Car firstCar = new Car(); Car secondCar = new Car(); // プロパティに値を代入する firstCar.setmanufacturer("トヨタ"); firstCar.setcarname("firstCar"); firstCar.setcolor("白"); firstCar.setdisplacement(3000); firstCar.setcapacity(7); secondCar.setmanufacturer("日産"); secondCar.setcarname("secondCar"); secondCar.setcolor("赤"); secondCar.setdisplacement(1600); secondCar.setcapacity(5); // プロパティの値を表示する Console.WriteLine("メーカー:{0}", firstCar.getmanufacturer()); Console.WriteLine("車名 :{0}", firstCar.getcarname()); Console.WriteLine("ボディ色:{0}", firstCar.getcolor()); Console.WriteLine("排気量 :{0}", firstCar.getdisplacement()); Console.WriteLine("定員 :{0}", firstCar.getcapacity()); Console.WriteLine("メーカー:{0}", secondCar.getmanufacturer()); Console.WriteLine("車名 :{0}", secondCar.getcarname()); Console.WriteLine("ボディ色:{0}", secondCar.getcolor()); Console.WriteLine("排気量 :{0}", secondCar.getdisplacement()); Console.WriteLine("定員 :{0}", secondCar.getcapacity()); Console.ReadLine(); // ここまで } } // クラスCar public class Car { public string manufacturer; // メーカー public string carname; // 車名 public string color; // ボディ色 public int displacement; // 排気量 public int capacity; // 定員 // メーカーを代入する public void setmanufacturer(string paramanufacturer) { manufacturer = paramanufacturer; } // 車名を代入する public void setcarname(string paracarname) { carname = paracarname; } // ボディ色を代入する public void setcolor(string paracolor) { color = paracolor; } // 排気量を代入する public void setdisplacement(int paradisplacement) { displacement = paradisplacement; } // 定員を代入する public void setcapacity(int paracapacity) { capacity = paracapacity; } // メーカーを返す public string getmanufacturer() { return manufacturer; } // 車名を返す public string getcarname() { return carname; } // ボディ色を返す public string getcolor() { return color; } // 排気量を返す public int getdisplacement() { return displacement; } // 定員を返す public int getcapacity() { return capacity; } } }
このようにsecondCar と言う名称でCarクラスをインスタンス化します。
簡単に言うと、firstCarと言う名前の入れ物とsecondCarと言う入れ物ができたようになります。
入れ物は2つになりましたが重複したコードを記述しなくてすむので効率的にコーディングすることが出来ます。
まとめ
最初はクラスを理解するのが難しいと思います。
実際、私は今でもあいまいに理解しています。
しかし、今後、オブジェクト指向は避けて通れないと思うので必要と思ったら積極的にクラスを使うようにしています。
コメント