【C#】クラスの構成

AtCoderやっていて、C#での関数の作り方がわからなかったので、ついでにクラスについても調べてみたので簡単にまとめたいと思う。(ほとんどメモ書きで見づらいですがご勘弁を)


■クラス
ある特定の状態や機能に着目してまとめたもの

class クラス名{
 
 //フィールド
 private/public 変数を宣言;
 //コンストラクタ
 public クラス名( 引数 ){ 初期値を設定 } //メソッド
 
 //メソッド
 型 メソッド名( 引数 ){ 処理; return 式; }
}

※それぞれをメンバという。

■アクセスの制限
・アクセス修飾子
private:フィールドにはクラスの外部からアクセスできない
public:フィールドにクラスの外部からアクセスできる
→一般的にクラスを設計するにあたって、フィールドに正しい値を設定するためのメソッドを定義する
→メソッドで正しい値であるか確認する処理を行ってから、フィールドに値を設定できるようにする

public void SetImage( image i ){
   img  = i ;
}
public Image GetImage( ){
   return img ;
}

※メンバにアクセス修飾子がなかった場合は、自動的にprivateになる
※クラス内部のデータを保護することを、カプセル化という

・プロパティ
フィールドにアクセスするプログラムが煩雑になることを避けるために、フィールドに簡潔にアクセスするために用意されたもの

アクセサ:setとgetというフィールド設定・取得専用の処理

public int Top{
   set { top = value;}  //setアクセサ
   get { return top;}  //getアクセサ
}

※setアクセサでは渡される値をvalueという値で設定しておく

■静的メンバ
個々のメソッドではなく、クラス全体を関連付けるために、フィールド・メソッドの先頭にstaticという指定をつける
クラス名.変数名で呼び出す

//フィールド
public static int Count = 0;
//コンストラクタ
public Car( ){
   Count++; //コンストラクタが呼び出されたときにフィールドのカウントに+1する
}
//メソッド
public static string CountCar( ){
   return "車は"+ Count + "台です";
}

■クラスの拡張
新しいクラスを設計することを、クラスを拡張する(extend)という
既存のクラスを基本クラス、新しいクラスを派生クラスという
基本食らうのメンバを受け継ぐことを継承(inheritance)という

class 派生クラス名: 基本クラス名{
    新しいフィールド;
    新しいメソッド( 引数 ){処理;}
} 

※基本クラスのprivateメンバには派生クラスからもアクセスできない
→基本クラスのメンバにprotectedを指定しておくことで、派生クラスからのみアクセスできる

・オーバーライド
基本クラスと同じ名前のオブジェクトがあった場合には、基本クラスのメソッドが呼び出される

class Car{
   void Move( ){
       position += 10;
   }
}
class RacingCar: Car{
   void Move( ){
       position += 100;
   }
}

※Moveメソッドを呼び出すと、new RacingCarで宣言しても、CarクラスのMoveメソッドが呼び出される

派生クラスを機能させるために、基本クラスにおいて、同じ名前で再定義される予定のメンバにはvirtualをつけておく
派生クラスのメンバにはoverrideをつけておく

class Car{
    virtual void Move( ){
    position += 10;
   }
}
class RacingCar: Car{
    override void Move( ){
    position += 100;
   }
}

・抽象クラスとインターフェイス
派生クラスに名前の提供のみを目的にした基本クラス

抽象クラス
オブジェクトを作成することができないようにしたクラス
抽象クラスでは、メソッドの内容自体を定義できないようにすることができ、このときメソッドにabstractをつけておく

abstract class クラス名{
   //オブジェクトの作成ができない
   virtual 戻り値 メソッド名( 引数 ){ }
   abstract 戻り値 メソッド名( 引数 ); //メソッドの内容を定義しないこともできる
}

インターフェイス
すべてのメソッドを定義できないようにしたクラス

interface インターフェイス名{
   戻り値 メソッド名( 引数 ); //メソッドの内容を定義できない
}

基本クラスでは、派生クラスを作成することを前提に、名前を提供し、派生クラスのオブジェクトをまとめて扱うことだけを目的に設計されるものもある。このような基本クラスでは、オブジェクトを作成することは必ずしも必要ではない。

一旦ここまで。