今回はC#によるクラスの使い方についてご紹介します。
クラスってよく聞くけどなにそれ?という方は、ここでしっかり押さえておいて下さいね。
C#に限らずクラスを語る上で重要なのが「オブジェクト指向」という概念です。
オブジェクト指向プログラミング行うの基礎となるクラスとインスタンスについて、言葉の意味をまずは覚えておきましょう。
クラス:よく言われるのは「オブジェクトを作成する際に基となる設計図」。
インスタンス:よく言われるのは「クラスを基に生成された実態」。
そして、クラス(設計図)を基にしてインスタンス(実態)を作る。とよく表現されます。
これがオブジェクト指向プログラミングの基本の考え方になります。
と、概念の話だけをしても良く分からないと思いますので、サンプルコードなどを用いて、具体的に説明していきます。
コンテンツ
C#のクラスの使い方
まずはC#のクラスの使い方について基礎的な部分からご紹介します。
クラスの使い方の基礎
まずはクラスを定義してみましょう。ここは設計図を書くイメージです。
クラスの宣言
まずはクラスの宣言方法。クラスの宣言は簡単で以下の様な記述になります。後ほど実際に使えるサンプルコードも出てきます。
■C#コードのイメージ(クラスの宣言)
1 2 3 4 |
class クラス名 { クラスの処理(実装内容) } |
クラスを使う上で覚えておきたい事
すごく簡易的ではありますが、以下の様なクラス関連用語がある事を知っておきましょう。
細かい使い方は、実際にプログラミングしながら覚えてOKです。
用語 | 意味 |
メンバ変数 | クラスの中で宣言される変数。 |
メンバ関数 | クラスの中で宣言される関数(メソッド)。 |
コンストラクター | インスタンスが生成された時(newされた時)に最初に呼ばれる関数。クラス名と同じ名前を定義。初期化などで使用される。 |
プロパティ | メンバ変数の設定・変更を行う。get/setという命令文を使用する。 |
インスタンスを作る
インスタンス(実態)の作り方をご紹介します。インスタンスを作る事で実際にクラスで設計した処理を使う事ができる様になるのです。
インスタンスの作り方は非常に簡単で以下の様に記述すればOKです。
■C#コードのイメージ(インスタンスの生成)
1 2 |
クラス名 変数名; 変数名 = new クラス名(); |
■C#コードのイメージ(インスタンスの生成を1行で書く場合)
1 |
クラス名 変数名 = new クラス名(); |
こちらの方がよく使われる記述方法になります。
※実際のコードはこの後に出てきます。
クラスを活用したコードを書いてみる
では実際にC#でクラスを活用したコードを記述してみます。
以下のコードと実行結果を見てみて下さい。その後で簡単な処理の解説も行っています。
■C#コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class TestClass1 //クラス { public int i_val1; //メンバ変数 public int i_val2; //メンバ変数 public TestClass1() //コンストラクタ { i_val1 = 1; i_val2 = 2; } public void Test_M() //メンバ関数 { int ival = i_val1 + i_val2; System.Console.WriteLine("i_val1+i_val2は"+ival); } } class TestClass2 { public static void Main() { TestClass1 t_cls = new TestClass1(); //インスタンスを生成 t_cls.Test_M(); t_cls.i_val1 = 5; t_cls.Test_M(); } } |
■実行結果
1 2 |
i_val1+i_val2は3 i_val1+i_val2は7 |
■説明
簡単に2つのクラスを使用した処理の流れを説明致します。
TestClass1について
- メンバ変数:i_val1とi_val2をメンバ変数として定義
- コンストラクタ:i_val1とi_val2を初期化
- メンバ関数:i_val1とi_val2を加算して結果を出力する関数
TestClass2について
- Main関数にてTestClass1のインスタンスを生成する。
- TestClass1のメンバ関数をコール。i_val1(初期値)とi_val2(初期値)を加算して結果出力
- i_val1に値を設定
- TestClass1のメンバ関数をコール。i_val1(設定値)とi_val2(初期値)を加算して結果出力
この処理を見ていただくと、
- クラスとはどういうものなのか
- インスタンスとはどういうものなのか
- クラスとインスタンスの使い方
をざっくりと理解していただけるのではないでしょうか?
併せて覚えておきたいのが、インスタンス生成後、クラスで定義したメンバ名は「インスタンスの変数名.メンバ名」で指定可能という事です。
また、メンバ変数宣言時に「Public」を指定していますが、Publiceを指定する事で、他のクラスからでも値を変更する事が可能になります。この辺の話は別記事で詳しくお伝えします。
クラスの継承について
あるクラスの機能を受けついで別のクラスを作る事を「継承」と言います。
ここではクラスの継承も行ってみたいと思います。
継承をする上で以下の2つのワードを覚えておきましょう。
・スーパークラス(基底クラス・親クラス):継承元となるクラス
・サブクラス(派生クラス・クラス):継承先のクラス
■C#コードのイメージ(クラスの継承)
1 2 3 4 |
class サブクラス名 : スーパークラス名 { クラスの処理(実装内容) } |
クラス継承のコードを書いてみる
実際にクラスを継承するコードを書いてみましょう。
クラス継承の時によくサンプルとして使われるのが、
- スーパークラス:人
- サブクラス:職業
というものです。このサンプルは非常によく分かりやすいです。
ただ、今回は抽象度を少し変えて、
- スーパークラス:生き物(Creature)
- サブクラス:人(Person)
という様なサンプルコードを作ってみたいと思います。
サンプルコードでは生き物の簡単なパラメータを出力する処理を実装してみます。
テレビゲームに登場するキャラのパラメータをイメージして、以下の通りいくつかの項目を作ってみました。
- スーパークラスのCreatureでは「名前」「年齢」を出力する処理を実装。
- サブクラスのPersonでは「種族」「性格」「特技」を出力する処理を実装。
■C#コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
class Creature //Creatureクラス { string name; int age; public Creature(string name, int age) { this.name = name; this.age = age; System.Console.WriteLine("名前: " + name + "\n" + "年齢: " + age + "歳"); } } class Person : Creature // Creatureクラスを継承 { string race; string personality; string skill; public Person(string name, int age, string race, string personality, string skill) : base(name, age) { this.race = race; this.personality = personality; this.skill = skill; System.Console.WriteLine("種族: " + race + "\n" + "性格: " + personality + "\n" + "特技: " + skill); } public static void Main(){ Person cls = new Person("jack", 30, "人", "ポジティブ", "魔法"); //インスタンスを生成 } } |
■実行結果
1 2 3 4 5 |
名前: jack 年齢: 30歳 種族: 人 性格: ポジティブ 特技: 魔法 |
■簡単な処理の説明
見ていただくと何となく分かると思いますが、
まず、Creatureクラスを定義・実装します。このCreatureクラスがスーパークラスとなります。
Creatureクラスのコンストラクタでは、「名前」「年齢」を出力しています。
次にCreatureクラスを継承してPersonクラスを定義・実装しています。
Personクラスのコンストラクタでは「種族」「性格」「特技」を出力しています。
また、途中で出てくる「this」というキーワードはそのインスタンス自身を指しています。Creatureクラスの中で使われる「this」はCreatureクラスを、Personクラスの中で使われる「this」はPersonクラスを指しています。
また、Personクラスのコンストラクタを定義する際に「: base(name, age)」という記述をしていますね。この「base()」というキーワードはサブクラスから、スーパークラスにアクセスする際に使用します。このキーワードを使用する事でスーパークラスのコンストラクタを呼び出しています。
まとめ
今回はC#でのクラスの使い方(特に以下の内容)についてご紹介しました。
- クラスの宣言
- インスタンスの生成
- クラスの活用サンプル
- クラスの継承
クラスは非常に奥が深いので、様々な構文やキーワードを身に付ける必要がありますが、大体のソースコードは今回学んだ知識で雰囲気は掴める様になると思います。