009.2. クラスを定義してみよう

過去のブログのアーカイブ
この記事は前身のブログのアーカイブを引き継いだものです. 画像が正しく表示できないなど,コンテンツの表示に問題がある恐れがあります.

サンプルソースでConsoleクラスやFileクラスを呼び出しましたが、自分オリジナルのクラスを作成することもできます。

オリジナルのくらすの使い道

コンソールアプリケーションを作った時に気付いた方もいるかもしれませんが、プログラムの開始地点はMainメソッドからです。
そして、そのMainメソッドがある場所はProgramクラスでしたね。

class Program
{
    static void Main(string[] args)
    {
        System.Console.WriteLine("Hello World!");
    }
}

基本的に、クラスとは○○のための処理の寄せ集め。みたいなものなのです。
他にも、データを固めるために使うという使い道があります。例えば、RPGゲームがあって、主人公データを作りたいとします。
主人公のパラメータにはHPやMP、攻撃力とか防御力とかあると思います。それを一つ一つ変数を作って管理すると、そのゲームがどんどん複雑になるにつれて管理できなくなってしまうのです。
管理しやすくするためにクラスを使う例もあります。

public class Charactor
{
    public int HP = 100;
    public int MP = 5;
    public int MaxHP = 100;
    public int MaxMP = 5;
    public int Power = 50;
    public int Defense = 10;
    public void Kaihuku() {
        // 30回復させる
        this.HP += 30;
        // HPが最大HPより大きくなってしまったら、HPを最大HPにする
        if (this.HP > this.MaxHP)
            this.HP = this.MaxHP;
    }
}
class Program
{
    static void Main() {
        Charactor ch = new Charactor();
        // 攻撃を受けた
        ch.HP -= 10;
        // ch.HP => 90
        ch.Kaihuku();
        // ch.HP => 100
    }
}

こんな感じになるかな。回復の処理とかをProgramkウラスの中に突っ込みまくると複雑になりすぎます!
キャラクター用の処理はできるだけ固めて設置した方が分かりやすいです。
また、キャラが2人いたって楽に書くことができます。

Charactor ch1 = new Charactor();
Charactor ch2 = new Charactor();

HPやMPとかのデータは別々に記録されるので、バグが起こりづらいです。

作り方

設置する場所

実はコンソールアプリケーションを作る時にすでにオリジナルのクラスは作っていましたが、新しく作るとしましょう。
新しいクラスが定義できるのは以下の場所のみです。

  • namespaceの外側
  • namespaceの内側
  • classの内側

実はクラスの中にクラスを定義することもできます。使われ方は非常に限定的なのでやめましょう。
できるだけ、そのプロジェクト名の名前空間がいいです。例えばこんな感じ

namespace ConsoleApplication1
{
    class Program
    {
        // ...
    }
}

 書き方

[アクセス修飾子] class [クラス名]
{
    // クラスの中身
}

classの後にクラス名を必ず起き、その後に{  }を置きます。
もしそのクラスへのアクセスに制限をかけたい場合はアクセス修飾子をclassの前に置きましょう。これは省略可能です。
設定できる内容には以下があります。

  • public
    そのプログラムの外からもアクセスできる
  • internal
    そのプログラムのみ、どこからでもアクセスできる
  • private
    クラスの中にクラスが設置されている場合、親クラスからのみアクセスできる。

基本的にはpublicかinternal。もし外からアクセスする必要がない場合のみprivateを指定しましょう。省略した場合はprivateが仮に置かれます。

メンバーを定義する

クラスの枠組みができたらメンバーを置きます。メンバーとは変数、プロパティやメソッド、デリゲート、イベント等のことを言います。

メソッドを定義

例えばメソッドを書くならこんな感じ。

public class TestClass
{
    // 動的メソッド
    public void TestDynamicMethod() {
        Console.WriteLine("Hello, Dynamic World!");
    }
    // 静的メソッド(static)
    public static void TestStaticMethod() {
        Console.WriteLine("Hello, Static World.");
    }
}

と、なります。これを呼び出すにはこのようにします。

public class Program
{
    public static void Main()
    {
        // 動的メソッドの呼び出し方
        TestClass tc = new TestClass();
        tc.TestDynamicMethod();
        //静的メソッドの呼び出し方
        TestClass.TestStaticMethod();
    }
}

動的メソッドはインスタンスを作成してから呼び出す必要があります。静的メソッドはインスタンスがなくても呼び出せます。

変数を定義

変数の書き方はこんな感じ。変数の使い方についてはこちら

public class TestClass
{
    public int Value = 10;
    public static int Value2 = 20;
}

クラスの中に直接、変数を置くことができます。
ここでの特徴はアクセス修飾子が付けれるということ。そしてこちらは、宣言と当時に代入する(初期化する)際に、メソッドの戻り値を代入することはできません。

プロパティを定義

プロパティの書き方についてはこちらを参照。例を書くとこんな感じ

public class TestClass
{
    public int Value { get; set; }
}
 イベントの定義

イベントとは、そのオブジェクトに何かしらの影響が起きたということを他に伝えるためにあります。
イベントと同時にデリゲートを覚える必要があるのでここでは割愛させていただきます。また別の項で紹介します。

静的クラスについて

クラスにも静的というものがあります。と言っても、これはインスタンスの生成(new)ができない、そのため、動的メソッドや動的変数を設置できないというものです。
言い換えればそれだけ。インスタンスを生成する必要のない、静的(static)なメンバーしかないときは静的クラスにしましょう。

public static TestMethod
{
    public static int Value { get; set; }
    public static void Test() {
        Console.WriteLine("Hello, World!");
    }
}

まとめ

クラスを作るときはclassを使う。メンバーには動的と静的両方入れれるけど、静的クラスは静的メンバーしか入れれない。