【C#入門】クラスとは?サンプル付きで使い方を徹底解説!

C#を学ぶ上で、クラスは最重要テーマの1つです。

悩んでる人

クラスって何なの?

悩んでる人

インスタンスとかオブジェクトとか、用語が多すぎて混乱する!

おしけん

混乱しますよね。

本記事では、C#におけるクラスの基本から実践的な使い方まで、サンプル付きで分かりやすく解説します。

この記事でわかること
  • C#のクラスとは何か
  • クラスの使い方や書き方
  • インスタンス / インスタンス化とは何か
  • オブジェクトとは何か
  • フィールド・プロパティ・メソッドの役割
  • アクセス修飾子(public / private)の違い
  • クラスの継承とオーバーライドについて
30秒でわかるクラス

*たい焼きで例えると、、、

  • クラスとは、「たい焼き専用の鉄板
  • インスタンスは、「たい焼き自身
  • クラスがあれば、何個でもインスタンスを作れる
  • オブジェクトとインスタンスは、
    ほぼ同じ意味
  • クラスからインスタンスが作られる」
    クラスからオブジェクトが作られる」
この記事を書いた人
  • システムエンジニア10年目
  • 会社員3年⇒フリーランス7年目
  • 保険系 / 物流系 / 鉄道系 / 小売系などのシステム開発に従事
  • プログラミングサポーター3年目
  • IT学習サポート実績:100名以上
目次

【C#】クラスとは何か?

クラスは、ひな形テンプレート

クラスとは、プログラムを作成する際のひな型の役割を持ったテンプレートです。

悩んでる人

テンプレートってどんなイメージなんだろう?

例えば、家でたい焼きを作る際、たいの形になるように自分で成形して、平型フライパンで焼くのは大変ですよね!

おしけん

自分で成形するのも楽しそうですけどね✨

たいの形をした専用の鉄板プレートで焼く方が、
圧倒的に楽です!

つまり、クラスは専用の鉄板プレートのイメージなんです。

悩んでる人

クラスは、たい焼きで言えば、鉄板プレートみたいな感じなんですね!

おしけん

クラス ≒ ひな形テンプレートの
イメージがあれば、さらに完璧です!

クラスは、C#のようなオブジェクト指向言語にとって、必要不可欠な仕組みといっても過言ではありません。

悩んでる人

たい焼きは、専用の鉄板1つで何個でも作れるけど、クラスの場合はどうなんだろう?

おしけん

とてもいい疑問です!

実は、クラスもたい焼きと同じことが言えます!

くわしく説明していきますね!

クラスがあれば、何個でもインタンス化できる

クラスから生成される具体的な実体をインスタンスといいます!

おしけん

ちなみに、クラスから実体を作ることをインスタンス化と言います

たい焼きの場合、「鉄板で作られるたい焼き」が
インスタンスです。

言い換えると、1つのクラスから、何個でもインスタンスを生成できるのです!

クラスとインスタンスの関係
  • クラス
    • たい焼き専用の鉄板プレートのイメージ
  • インスタンス
    • たい焼き本体のイメージ
おしけん

クラスとインスタンスのイメージはできましたか?

クラス⇔インスタンスの関係がイメージできたら、さらにオブジェクトも含めて関係が整理できると完璧です!

オブジェクトについて説明しますね!

オブジェクトとインスタンスは、ほぼ同じ!

オブジェクトとインスタンスの違いは、言葉の大きさ!

インスタンスは、オブジェクトの一つという位置付けです。

オブジェクトは、プログラムで扱える実体の総称を指し、クラスから作ったオブジェクトをインスタンスと呼んでいます。

おしけん

実務では、オブジェクトとインスタンスを使い分けている人は、いない印象です。

チームメンバーとやり取りする際は、オブジェクト≒インスタンスとして、会話しても問題ないです。

オブジェクトとインスタンスについて
  • オブジェクト
    • プログラムで扱える実体のこと。
  • インスタンス
    • オブジェクトの中でも、特にクラスから生成した実体のこと。

C#プログラムでは、値やオブジェクトという形でデータを扱うのが基本です。

おしけん

クラス⇔インスタンス⇔オブジェクトの整理ができたら、あとは、使い方を覚えるだけです!

悩んでる人

クラスは何で必要なんだろう?

おしけん

確かに、とても本質的な疑問ですね!

クラスは何のために使うのか、その理由を説明しますね!

【C#】クラスを使う理由

悩んでる人

クラスは何のために使うの?

おしけん

クラスを何のために使うかを理解することはとても大切です!

クラスを使う理由は、大きく2つあります。

クラスを使う理由
  • 関連するデータをひとまとめにするため
  • 関連するメソッドをひとまとめにするため

クラスを使う理由を意識するだけでも、クラスの理解がグッと深まりますよ!

それぞれ順番に説明していきますね!

関連するデータをひとまとめにするため

クラスを使うと、バラバラに管理されていたデータを1つにまとめることができます!

例えば、3人の学生情報をプログラムで扱う場合、クラスを使わなければ、用意する変数の数が多くなります。

クラスを使わないコード例

//****************************************
// 生徒Aの学生情報を扱う変数
//****************************************
int studentId1 = 111111;             //学生番号
string studentName1 = "田中 A郎";    //氏名
string gender1 = "男性";             //性別
int age1 = 20;                       //年齢
int grade1 = 2;                      //学年
string faculty1 = "理工学部";        //学部

//****************************************
// 生徒Bの学生情報を扱う変数
//****************************************
int studentId2 = 222222;             //学生番号
string studentName2 = "佐藤 B子";    //氏名
string gender2 = "女性";             //性別
int age2 = 19;                       //年齢
int grade2 = 1;                      //学年
string faculty2 = "外国語学部";      //学部

//****************************************
// 生徒Cの学生情報を扱う変数
//****************************************
int studentId3 = 333333;             //学生番号
string studentName3 = "鈴木 C太";    //氏名
string gender3 = "男性";             //性別
int age3 = 22;                       //年齢
int grade3 = 4;                      //学年
string faculty3 = "法学部";          //学部

クラスを使わないと、関連するデータをバラバラに管理しなければいけません。

おしけん

もちろん、どの変数に何が格納されているか、分かりやすければ良いです。

1000人、2000人・・・と、プログラムで扱う学生の人数が増えるほど、用意する変数の数は増えます。

変数の数が膨大になり、「どの変数が誰の情報なのか」が徐々に見えづらくなっていきます

おしけん

クラスを使えば、この問題をスッキリ解消できますよ!

クラスは、バラバラに管理されていた変数を1つに束ねることができます!

クラスを使えば、先ほどのコード例は、次のように3行でスッキリにできます!

おしけん

クラス名は、バラバラに管理された学生情報をまとめるクラスなので、学生クラスとしています!

クラスを使ったコード例

//****************************************
// 生徒Aの学生情報を扱う変数
//****************************************
Student gakuseiA = new Student(11111,"田中 A郎","男性",20,2,"理工学部","○○大学","0120-111-111");

//****************************************
// 生徒Bの学生情報を扱う変数
//****************************************
Student gakuseiB = new Student(22222,"佐藤 B子","女性",9,1,"外国語学部","○○大学","0120-222-222");

//****************************************
// 生徒Cの学生情報を扱う変数
//****************************************
Student gakuseiC = new Student(33333,"鈴木 C太","男性",22,4,"法学部","○○大学","0120-333-333");

それぞれの変数「gakusei」の中に、学生番号、氏名、学部、学校名など、全ての情報が詰め込まれた状態になっています。

gakuseiA,gakuseiB,gakuseiCは、Studentクラスをひな形テンプレートにしているため、大枠は同じです。

大枠は同じでも、別々の情報を持つため、それぞれが固有なオブジェクトです!

おしけん

学生クラスは、以下のようなコード例となります。

学生クラスの定義

/// <summary>
/// 学生クラス
/// </summary>
public class Student
{

    //****************************************
    // プロパティ(データ項目を管理できるもの)
    //****************************************

    //■ (プロパティ)学生番号
    public int StudentId { get; set; }  

    //■ (プロパティ)氏名
    public string StudentName { get; set; }  

    //■ (プロパティ)性別
    public string Gender { get; set; }  

    //■ (プロパティ)年齢
    public int Age { get; set; } 

    //■ (プロパティ)学年
    public int Grade { get; set; }   

    //■ (プロパティ)学部
    public string Faculty { get; set; }  

    //■ (プロパティ)学校名
    public string SchoolName { get; set; }

    //■ (プロパティ)電話番号
    public string PhoneNumber { get; set; }


    //****************************************
    // コンストラクタ
    //****************************************
    public Student(int studentId, string studentName, string gender, int age 
                  , int grade, string faculty, string schoolName, string phoneNumber){

        this.StudentId = studentId;
        this.StudentName = studentName;
        this.Gender = gender;
        this.Age = age;
        this.Grade = grade;
        this.Faculty = faculty;
        this.SchoolName = schoolName;
        this.PhoneNumber = phoneNumber;
    }

}

このように、学生クラスを用意することで、学生番号や学部など、学生に関する様々な項目をまとめることができます。

悩んでる人

プロパティとか、コンストラクタって何だろう?

プロパティは、データ項目を管理できて、変数のように使えるものと考えてください!

また、コンストラクタは、インスタンス生成時だけ実行される処理で、初期値を一括設定するために使うことが多いですね。

おしけん

クラスを使う理由は、もう一つあります!

関連するメソッドをひとまとめにするため

クラスの用途は、データを束ねるだけではありません。

取り扱うデータに関係する処理(メソッド)もまとめられます!

例えば、学生情報を扱うメソッドは、学生クラスの一部として整理できます。

学生クラスでメソッドをまとめたコード例

/// <summary>
/// 学生クラス
/// </summary>
public class Student
{

    //****************************************
    // プロパティ
    //****************************************

    // (プロパティ)学生番号
    public int StudentId { get; set; }  

    // (プロパティ)氏名
    public string StudentName { get; set; }  

    // (プロパティ)学年
    public int Grade { get; set; }   

    // (プロパティ)学部
    public string Faculty { get; set; }  

    // (プロパティ)学校名
    public string SchoolName { get; set; }

    // (プロパティ)電話番号
    public string PhoneNumber { get; set; }

    //****************************************
    // メソッド
    //****************************************

    // ■(メソッド)学生情報を表示する処理
    public void ShowStudentInfo()
    {
        //各種プロパティで管理されている学生情報を表示
        Console.WriteLine($"【学生情報】");
        Console.WriteLine($"  学生番号:{StudentId}");
        Console.WriteLine($"  氏名:{StudentName}");
        Console.WriteLine($"  学年:{Grade}");
        Console.WriteLine($"  学部:{Faculty}");
        Console.WriteLine($"  学校名:{SchoolName}");
    }

    // ■(メソッド)学年を1つ上げる処理
    public void PromoteGrade()
    {
        //学年をカウントアップ
        this.Grade++;
    }

    // ■(メソッド)電話番号を変更する処理
    public void ChangePhoneNumber(string newPhoneNumber)
    {
        //電話番号を引数で共有された値へ上書き
        this.PhoneNumber = newPhoneNumber;
    }

    //****************************************
    // コンストラクタ
    //****************************************
    public Student(int studentId, string studentName, string gender, int age 
                  , int grade, string faculty, string schoolName, string phoneNumber){

        this.StudentId = studentId;
        this.StudentName = studentName;
        this.Gender = gender;
        this.Age = age;
        this.Grade = grade;
        this.Faculty = faculty;
        this.SchoolName = schoolName;
        this.PhoneNumber = phoneNumber;
    }

}

このように、クラスを使うと、データの表示や更新やチェック処理など、様々なメソッドをまとめられます。

これは、コードの読みやすさ・保守のしやすさに直結していきます!

おしけん

クラスを作るときは、関連するデータと処理をまとめた形で作成するのが基本になってきます!

ここからは、C#でクラスを使う方法について、確認していきましょう!

【C#】クラスの基本的な使い方

悩んでる人

クラスとインスタンスのイメージはできたけど、どうやってクラスを使えばいいんだろう?

おしけん

たい焼きの例で説明しますね。

以下の図が、C#でクラスを使う大まかなイメージです。

外部で用意されたクラスを、
アプリ内でインスタンス化して使う

クラスを使うまでの流れは、以下のとおりです。

クラスを使うまでの流れ
  • クラスファイルを新規作成
    • Taiyaki.csを作成する
  • クラス定義をクラスファイルに書いていく
    • Taiyaki.csファイルに、たい焼きクラスの定義を書く
  • クラスはインスタンス化して使う
    • たい焼きクラスをアプリ側でインスタンス化する

クラスを使うまでの流れについて、説明していきますね!

クラスは、ファイルごと新しく作成する

C#でクラスを使うには、ファイルごと新しくクラスを作成する必要があります。

クラス用のcsファイルをクラスファイルとして新規作成し、そこにクラスの定義を書いていきます。

おしけん

たい焼きクラスの場合は、Taiyaki.csを作成することですね

新規でクラスファイルを作成するには、Visual Studioのソリューションエクスプローラーから操作するのが簡単!!

プロジェクト配下で、任意の場所を選択して右クリックします。

上記の例の場合は、プロジェクト名「ConsoleApp」を左クリックして選択状態にした後に右クリックすれば、メニュー一覧が表示されるので、「追加(D)」⇒「新しい項目(W)…」を選択します。

以下のように、「新しい項目の追加」ダイアログが表示されるので、クラスを選択した後、任意のクラス名をつけたら追加ボタンをクリックします。

今回は、クラス名を「Taiyaki」とします。

クラス追加が完了すると、Taiyaki.csというファイル名でクラスファイルが新しく作成されます。

そして、Taiyaki.csファイルの中には、クラスの大枠定義が作成済になっています。

おしけん

基本的に、1クラス1ファイルとなるように作成します。

初期のクラスは、{ }(波カッコ)の中身にコードが書かれてない状態です。

つまり、白紙の状態なので、どんなクラスにするのか、コードを自分で書いていくことになります!

おしけん

どのようにコードを書いていけば良いか確認しましょう!

クラスの書き方とは?4つの構成要素を意識しよう!!

C#のクラスは、キーワード class に続けてクラス名を書き、{ } の中に定義を書きます。

// 〇〇クラス
class Xxxxxx
{
 //ここに具体的なクラスの定義内容を書いていく。
}
おしけん

クラス名は、どんなクラスなのか分かる名前を付けましょう!

C#の慣習として、クラス名は先頭大文字のパスカルケースにします。

例えば、車クラスであれば「Car」、学生クラスであれば「Student」といった感じ!

{ } の中に書くクラス定義を構成する要素は、
4つ!!

おしけん

車クラスであれば、以下のイメージです!

クラスを構成する4つの要素
  1. フィールド
    • データを格納できる変数
    • クラス内で定義された変数をフィールドと呼ぶ
  2. メソッド
    • 一連の処理をまとめた関数
    • クラス内で定義された関数をメソッドと呼ぶ
  3. プロパティ
    • 変数ではないが変数のように扱う
    • 外部とフィールドを仲介する窓口
    • フィールドへの安全なアクセスをサポート
    • フィールドのように扱えるのが特徴
  4. コンストラクタ
    • 特殊なメソッド
    • インスタンス生成時のみ実行される
    • 初期値の一括設定に使うことがメイン

例えば、車クラスをC#で定義した場合、以下のようにイメージになります。

C#で車クラスを書いたコード例

/// 車クラス
public class Car
{

    //****************************************
    // フィールド
    //****************************************
    private int carId;       //車を識別するID
    private string maker;    //メーカー名
    private string carName;  //車名
    private string color;    //色
    private int mileage;     //走行距離
    private int speed;       //スピード

    //****************************************
    // プロパティ
    //****************************************

    // (プロパティ)車ID
    public int CarId
    {
        get { return this.carId; }
        set { if (value > 0) this.carId = value; }
    }

    // (プロパティ)メーカー名
    public string Maker
    {
        get { return this.maker; }
        set { if (!string.IsNullOrEmpty(value)) this.maker = value; }
    }

    // (プロパティ)車名
    public string CarName
    {
        get { return this.carName; }
        set { if (!string.IsNullOrEmpty(value)) this.carName = value; }
    }

    // (プロパティ)色
    public string Color
    {
        get { return this.color; }
        set { if (!string.IsNullOrEmpty(value)) this.color = value; }
    }

    // (プロパティ)走行距離
    public int Mileage
    {
        get { return this.mileage; }
        set { if (value >= 0) this.mileage = value; }
    }

    // (プロパティ)現在の速度
    public int Speed
    {
        get { return this.speed; }
    }

    //****************************************
    // コンストラクタ
    //****************************************
    //   コンストラクタは、インスタンス化の時だけ実行される特別なメソッド。
    //   用途は各情報の初期設定。
    public Car(int carId, string maker, string carName, string color, int year)
    {
        this.CarId = carId;
        this.Maker = maker;
        this.CarName = carName;
        this.Color = color;
        this.Mileage = mileage;
        this.speed = 0;
    }

    //****************************************
    // メソッド
    //****************************************

    // (メソッド)車の情報を表示する
    public void ShowCarInfo()
    {
        Console.WriteLine("車ID:" + this.CarId);
        Console.WriteLine("メーカー:" + this.Maker);
        Console.WriteLine("車名:" + this.CarName);
        Console.WriteLine("色:" + this.Color);
        Console.WriteLine("走行距離:" + this.Mileage + "km");
        Console.WriteLine("現在の速度:" + this.Speed + "km/h");
    }

    // (メソッド)加速する
    public void Accelerate(int value)
    {
        if (value <= 0)
        {
            return;
        }

        this.speed += value;
    }

    // (メソッド)減速する
    public void Brake(int value)
    {
        if (value <= 0)
        {
            return;
        }

        this.speed -= value;

        if (this.speed < 0)
        {
            this.speed = 0;
        }
    }

    // (メソッド)走行する
    public void Drive(int distance)
    {
        if (distance <= 0)
        {
            return;
        }

        this.mileage += distance;
    }

}

クラスの完成イメージ例は、上記のとおり。

ここからは、作成したクラスの使い方について、説明していきますね!

クラスはテンプレートにすぎない!インスタンス化して使う

クラスを定義しただけでは、まだ使えません。

使うためには、new キーワードでインスタンス化(実体を生成)する必要があります。

インスタンス化の書き方

〇〇クラスのインスタンス化は、new 〇〇() ;と書きます!

  • (例)Studentクラスのインスタンス化は、new Student() ;
  • (例)Carクラスのインスタンス化は、new Car() ;
おしけん

実際のところ、インスタンス化だけでは使えません。

クラスをインスタンス化したら、変数に格納するところまでが、一連の流れです。

例えば、車クラスの場合、Car prius = new Car() ; と書きます。

車クラスを使ったコード例

//■ 1つのインスタンスが、車1台分の情報を表しています。

//****************************************
//■ new でインスタンス生成したら、インスタンスを変数へ格納
//****************************************
Car car1 = new Car(1, "トヨタ", "プリウス", "白", 2022, 15000);
Car car2 = new Car(2, "日産", "セレナ", "青", 2025, 30000);


//****************************************
//■ 各インスタンス情報をメソッドで操作
//****************************************

// car1の操作
car1.Accelerate(40);
car1.Brake(10);
car1.Drive(100);
car1.ShowCarInfo();

// car2の操作
car2.Accelerate(30);
car2.Brake(5);
car2.Drive(140);
car2.ShowCarInfo();
ポイント

car1car2 は、同じCarクラス型ですが、それぞれ独立したオブジェクトとして動作します

ここまで、クラスの作り方や使い方について、簡単に説明しました。

悩んでる人

ところで、インスタンス化はnew Car(); じゃないのかな?

悩んでる人

どうして
new Car(1,"トヨタ","プリウス","白",2022,15000);って書けるのかな?

おしけん

実は、どちらも正解です!

これは、コンストラクタが関係しています。

ここからは、クラスを構成するコンストラクタについて、紹介していきます。

【C#】コンストラクタとは

コンストラクタは初期化メソッド

コンストラクタとは、インスタンス化の時だけ実行される特別なメソッドです。

実行タイミングは、インスタンス生成時!!

インスタンス化の時は、new Car();と書いてますが、実はコンストラクタを実行しています。

コンストラクタの用途は、初期値の設定やオブジェクトの準備処理など。

実際のイメージは、以下のようにインスタンス生成時に、データを一括設定する流れです。

上記のイメージでは、new Car("赤",100);の書き方でインスタンス化していますが、オーバーロードを活用しています。

オーバーロードを利用できる

コンストラクタはメソッドの一つなので、オーバーロードが使えます。

オーバーロードとは

メソッドの引数の数やデータ型の組合せを変えることで、定義したメソッド名が全く同じでも、重複定義できる仕組みのこと。多重定義と訳されたりします。

以下の例で、コンストラクタ①②のような複数定義が可能です!

コンストラクタを書いた車クラスの例

//車クラス
public class Car
{
    public string Color; //フィールド:車の色
    public int Speed;    //フィールド:走行速度

    // コンストラクタ⓵ *new Car()したときに実行される
    public Car()
    {

    }

    // コンストラクタ⓶ *new Car("赤",100)などすれば実行される
    public Car(string color, int speed)
    {
        this.Color = color;
        this.Speed = speed;
    }

    public void Run()
    {
        Console.WriteLine($"{Color}の車が{Speed}km/hで走っています");
    }
}

上記の車クラスでは、オーバーロードによって、複数のコンストラクタを作成しているので、
以下の2パターンでインスタンス生成できます

どちらの書き方でもインスタンス化できる
  • パターン1:new Car();
  • パターン2:new Car("赤", 100);

車クラスをインスタンス化する例

//***************************************************
// パターン1
//***************************************************

// コンストラクタ⓵を実行してインスタンス化
Car car1 = new Car();

// コンストラクタ⓵で処理を何もしない場合は、個別で設定する
car1.Color = "青";
car1.Speed = 10;

//***************************************************
// パターン2
//***************************************************

// コンストラクタ⓶を実行してインスタンス化
Car car2 = new Car("赤", 100);

// コンストラクタ⓶では初期値を設定しているので、個別で設定する必要はない。
// けれども、別の情報に書き換えることもできる。
car2.Color = "緑";
悩んでる人

コンストラクタはnew Car()でもnew Car("赤",100)でもインスタンス化できたんですね!

悩んでる人

ところで、普通のメソッドと何が違うの?

大きな違いは、実行タイミングですが、他にも細かい部分で違う点があるので、紹介していきますね。

コンストラクタと通常メソッドの違い

コンストラクタはメソッドの一つですが、通常のメソッドと比べ、使い方や書き方に違いがあります。

通常のメソッドとの違い
  • メソッド名
    • クラス名と同じメソッド名になる。
  • 戻り値の型
    • voidも含めて戻り値のデータ型は書かない。
  • 実行タイミング
    • インスタンス化の時だけしか実行しない。

コンストラクタと通常メソッドのコード例

//車クラス
public class Car
{
    public string Color; //フィールド:車の色
    public int Speed;    //フィールド:走行速度

    //コンストラクタ 
    //  *メソッド名:クラス名と同じ名前、戻り値:voidなど書かない。
    public Car()
    {
        this.Color = "赤";
        this.Speed = 40;
    }

    //通常のメソッド
    public void Run()
    {
        Console.WriteLine($"{Color}の車が{Speed}km/hで走っています");
    }

    //通常のメソッド
    public bool CheckFastSpeed()
    {
        if(this.Speed >= 80){
            return true;
        }else{
            return false;
        }
    }
}
おしけん

クラスの作り方と使い方のイメージがあれば、70%くらいの理解度は達成していますよ!!

【C#】フィールドとプロパティの違い

フィールドとプロパティは、いずれもデータを格納できる変数のように見えますが、それは間違いです。

フィールドが変数で、プロパティはフィールドを仲介する窓口なんです!

フィールドとプロパティの違い
  • フィールド
    • クラス内に定義した変数のこと。
    • データを格納する役割。
  • プロパティ
    • クラス外部とフィールドを仲介する窓口。
    • データを保持する役割はない。

プロパティは get / set を使って、フィールドへのアクセスを制御できるため、実務ではプロパティが推奨されます。

public class Car
{
    // フィールド(private にして外部から直接アクセスさせない)
    private string _color;
    private int _speed;

    // プロパティ(get/set でアクセスを制御)
    public string Color
    {
        get { return _color; }
        set
        {
            // バリデーション:空文字は許可しない
            if (!string.IsNullOrEmpty(value))
                _color = value;
        }
    }

    // 自動実装プロパティ(シンプルな書き方)
    public int Speed { get; set; }
}

【C#】メソッドの定義と呼び出し方

メソッドはクラスに定義する「処理のまとまり」です。

戻り値がない場合は void、値を返す場合は戻り値の型(intstring など)を指定します。

public class Car
{
    // フィールド
    public string Color { get; set; }
    public int Speed { get; set; }

    // ■ 戻り値なし(void)、引数なしのメソッド
    public void Run()
    {
        Console.WriteLine($"{Color}の車が{Speed}km/hで走っています");
    }

    // ■ 戻り値あり(string を返す)、引数なしのメソッド
    public string GetInfo()
    {
        return $"色:{Color}、速度:{Speed}km/h";
    }

    // ■ 戻り値なし(void)、引数ありのメソッド
    public void Accelerate(int addSpeed)
    {
        Speed += addSpeed;
        Console.WriteLine($"加速しました。現在の速度:{Speed}km/h");
    }
}
おしけん

「処理を実行するだけなら void、何か値を返したいなら戻り値の型を指定する」と覚えておきましょう!

【C#】アクセス修飾子(public / private)

アクセス修飾子は、クラスのメンバーへのアクセス範囲を制限するキーワードです。

外部に公開すべきものは public、内部だけで使うものは private にするのが基本です。

// 銀行口座クラス
public class BankAccount
{
    // private:外部から直接変更させない
    private int _balance = 0;

    // public:残高を確認する(読み取りのみ)
    public int Balance { get { return _balance; } }

    // public:入金メソッド(金額チェックつき)
    public void Deposit(int amount)
    {
        if (amount > 0)
            _balance += amount;
    }

    // public:出金メソッド(残高チェックつき)
    public bool Withdraw(int amount)
    {
        if (amount > 0 && amount <= _balance)
        {
            _balance -= amount;
            return true;
        }
        return false;
    }
}
⚠️ 注意

publicなフィールドは、外部から不正値が設定されるリスクがあるため、フィールドは privateとし、公開用には public なプロパティやメソッドを用意するのが安全です。

【C#】クラス継承の基本

継承とは、あるクラスに既存のクラスの機能を引き継ぐことができる仕組みです。

継承では、以下の用語を覚えておきましょう!

継承の基本用語
  • 基底クラス
    • 新しいクラスを作る際に引き継がれる側のクラスのこと。
    • 親クラスやスーパークラスと呼ぶことが多い。
  • 派生クラス
    • 基底クラスを引き継いで作成されたクラスのこと。
    • 子クラスやサブクラスと呼ぶことが多い。

共通処理を基底クラスにまとめることで、コードの重複を減らせます

例えば、乗り物クラス「Vehicle」を基底クラスとして、車クラス「Car」やトラッククラス「Truck」などを派生クラスとして作成した例で説明します。

基底クラス(親クラス)のコード例

// 乗り物クラス
public class Vehicle
{
    //フィールド
    public string Color { get; set; }
    public int Speed { get; set; }

    public virtual void Run()
    {
        Console.WriteLine($"{Color}の乗り物が走っています");
    }
}

派生クラス(子クラス)のコード例

// 車クラス(乗り物クラスを継承)
public class Car : Vehicle
{
    //フィールド
    public int DoorCount { get; set; }

    // override でメソッドを上書き
    public override void Run()
    {
        Console.WriteLine($"{Color}の車({DoorCount}ドア)が走っています");
    }
}

以下のように、車クラスCarのインスタンス生成を生成していますが、ポイントは、車クラスCarのフィールドとして、ColorSpeedを使うことができることです。

// 車クラスのインスタンス生成
Car car = new Car() { Color = "赤", Speed = 100, DoorCount = 4 };

// 車インスタンスを操作
car.Run(); 

車クラスCarに、ColorSpeedはフィールドとして定義されていませんが、乗り物クラスVehicle継承しているから使うことができます!

また、基底クラスのメソッドを子クラスで上書きすることを「オーバーライド」と言います。

おしけん

基底クラスのメソッドに virtual、派生クラスに override をつければOKです!

ポイント

継承は「共通の機能を親にまとめ、個別の機能は子に追加する」という設計思想です

まとめ

  • クラスはオブジェクトを作るための「設計図」。new でインスタンス(実体)を生成する
  • コンストラクタは new したときに自動で呼ばれる初期化メソッド
  • フィールドはデータの格納、プロパティは get/set でアクセス制御ができる(実務はプロパティ推奨)
  • メソッドは処理をまとめたもの。戻り値がなければ void、あれば型を指定する
  • アクセス修飾子で公開範囲を制御。フィールドは private、公開部分は public が基本
  • 継承で既存クラスの機能を引き継いで新しいクラスを作れる(virtual + override
おしけん

クラスは最初は難しく感じますが、実際にコードを書いて動かすうちに必ず慣れてきます!まずは簡単なクラスを自分で作ってみることが一番の近道ですよ!

C#のクラスをマスターすると、オブジェクト指向プログラミングの世界が広がります。

次のステップとして、インターフェースや抽象クラスにも挑戦してみましょう!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次