はじめてのC#【 07_オーバーロード】

##    はじめに

  __<font color="blue">　【C#(シーシャープ)】</font>__ はMicrosoft社が開発した
　　　プログラミング言語で、C++やJavaに似た構文を持ち
　　　.NET Framework上で稼働するWindowsアプリの開発や
　　　Webアプリケーション開発のためのフレームワークである
　　　ASP.NETが使用可能なプログラム言語です。

##### このメモは、C#の基本的な記載方法のまとめです。

--------------------------------------------------------------

## 前回

https://qiita.com/nano357/items/b29123769bf524128dc4

------------------------------------------------

## <font color="green">オーバーロード</font>
#### 引数が異なるメソッドを同名で定義できる機能

 ##### 「人」を表す Person クラス
```C#
using System;

public class Person
{
    // 自動実装プロパティを使用して年齢、名前、性別を管理
    public int Age { get; set; }       // 年齢プロパティ
    public string Name { get; set; }   // 名前プロパティ
    public string Gender { get; set; } // 性別プロパティ

    // 引数なしのコンストラクタ
    public Person()
    {
        Age = 0;                 // デフォルト値の設定
        Name = "未設定";         // デフォルト値の設定
        Gender = "どちらでもない"; // デフォルト値の設定
    }


    /* オーバーロード
       同じ名前のメソッドで異なる引数リストを定義することができます。
       これにより、異なる引数の組み合わせに応じて適切なメソッドが呼び出されます。
    */

    /* 
       以下のSetInfoメソッドは、異なる引数リストで複数回定義されています。
    */

    // 年齢を設定するメソッド（整数型）
    public void SetInfo(int newAge)
    {
        Age = newAge; // 年齢を設定
    }

    // 性別を設定するメソッド（文字列型）
    public void SetInfo(string newGender)
    {
        Gender = newGender; // 名前を設定
    }

    // 年齢と名前を設定するメソッド（整数型と文字列型）
    public void SetInfo(int newAge, string newName)
    {
        Age = newAge;   // 年齢を設定
        Name = newName; // 名前を設定
    }

    /* 年齢、名前、性別を設定するメソッド
      （整数型と文字列型と文字列型）       */
    public void SetInfo(int newAge, string newName, string newGender)
    {
        Age = newAge;    // 年齢を設定
        Name = newName;  // 名前を設定
        Gender = newGender; // 性別を設定
    }
}
````


 ##### クラスから実際に作り出したインスタンス
```C#
public class PersonTest
{
    public static void Main(string[] args)
    {
        // 引数なしコンストラクタでインスタンス化
        Person person = new Person();

        // 初期化された名前、年齢、性別を表示
        Console.WriteLine("初期化された年齢は " + person.Age);
        Console.WriteLine("初期化された名前は " + person.Name);
        Console.WriteLine("初期化された性別は " + person.Gender);
        Console.WriteLine();

        // SetInfoメソッド（整数型）を使用して年齢を変更
        person.SetInfo(28);

        // SetInfoメソッド（文字列型）を使用して名前を変更
        person.SetInfo("男性");

        Console.WriteLine("年齢が変更されました " + person.Age);
        Console.WriteLine("名前は変更されません " + person.Name);
        Console.WriteLine("性別が変更されました " + person.Gender);


        /* SetInfoメソッド（整数型と文字列型）
                                  を使用して名前を変更 */
        person.SetInfo(38, "真太郎");
        Console.WriteLine("年齢が変更されました " + person.Age);
        Console.WriteLine("名前が変更されました " + person.Name);
        Console.WriteLine("性別は変更されません " + person.Gender);
        Console.WriteLine();

        // SetInfoメソッド（文字列引数2つと整数引数1つ）を使用して名前、年齢、性別を変更
        person.SetInfo(17, "姫", "女性");
        Console.WriteLine("年齢が変更されました" + person.Age);
        Console.WriteLine("名前が変更されました" + person.Name);
        Console.WriteLine("性別が変更されました" + person.Gender);
        Console.WriteLine();

    }
}
````

 #####  実行結果

````
初期化された年齢は 0
初期化された名前は 未設定
初期化された性別は どちらでもない

年齢が変更されました 28
名前は変更されません 未設定
性別が変更されました 男性

年齢が変更されました 38
名前が変更されました 真太郎
性別は変更されません 男性

年齢が変更されました17
名前が変更されました姫
性別が変更されました女性
````



------------------------------------------------

#### <font color="green">プロパティを追加してフィールドに値を設定</font>
 ##### 「人」を表す Person クラス
```C#
using System;

public class Person
{
    // プライベートフィールド
    private int age;          // 年齢
    private string name;      // 名前
    private string gender;    // 性別

    // 年齢プロパティ（整数型）
    public int Age
    {
        get { return age; }
        set { age = value; }
    }

    // 名前プロパティ（文字列型）
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    // 性別プロパティ（文字列型）
    public string Gender
    {
        get { return gender; }
        set { gender = value; }
    }

    // 年齢と名前をまとめて設定するためのプロパティ
    public Tuple<int, string> AgeAndName
    {
        // get アクセサー: 年齢と名前をまとめたタプルを返します
        get
        {
            /*
               Age プロパティから年齢の値を取得し、
               name フィールドから名前の値を取得します。
               それらの値を Tuple.Create メソッドを使用して
               タプルとして返します。 ※1
            */
            return Tuple.Create(Age, name);
        }
        /* set アクセサー: タプルを受け取り、
           年齢と名前をプロパティに設定します */
        set
        {
            /*
               value.Item1 でタプルの最初の要素（年齢）を取得し、
                                     Age プロパティに設定します。
               value.Item2 でタプルの第二の要素（名前）を取得し、
                                     name フィールドに設定します。
            */
            Age = value.Item1;   // タプルの最初の要素を Age プロパティに設定
            name = value.Item2;  // タプルの第二の要素を name フィールドに設定
        }
    }

    // 引数なしのコンストラクタ
    public Person()
    {
        /* デフォルト値の設定 */
        Age = 99;              // 年齢のデフォルト値を設定
        Name = "名前未設定";   // 名前のデフォルト値を設定
        Gender = "性別未設定"; // 性別のデフォルト値を設定
    }
}
````


 ##### クラスから実際に作り出したインスタンス
```C#
public class PersonTest
{
    public static void Main(string[] args)
    {
        // 引数なしコンストラクタでインスタンス化
        Person person = new Person();

        // 初期化された名前、年齢、性別を表示
        Console.WriteLine("初期化された年齢は " + person.Age);
        Console.WriteLine("初期化された名前は " + person.Name);
        Console.WriteLine("初期化された性別は " + person.Gender);
        Console.WriteLine();

        // 年齢プロパティを使用して年齢を変更
        person.Age = 38;
        // 名前プロパティを使用して名前を変更
        person.Name = "真太郎";
        // 性別プロパティを使用して性別を変更
        person.Gender = "男性";

        Console.WriteLine("年齢が変更されました: " + person.Age);
        Console.WriteLine("名前が変更されました: " + person.Name);
        Console.WriteLine("性別が変更されました: " + person.Gender);
        Console.WriteLine();

        // 年齢と名前をまとめて設定するためのプロパティを使用
        person.AgeAndName = Tuple.Create(22, "奈野");
        Console.WriteLine("年齢が変更されました: " + person.Age);
        Console.WriteLine("名前が変更されました: " + person.Name);
        Console.WriteLine("性別は変更されません: " + person.Gender);
        Console.WriteLine();
    }
}
````

 #####  実行結果

````
初期化された年齢は 99
初期化された名前は 名前未設定
初期化された性別は 性別未設定

年齢が変更されました: 38
名前が変更されました: 真太郎
性別が変更されました: 男性

年齢が変更されました: 22
名前が変更されました: 奈野
性別は変更されません: 男性
````

※1
[【C#】タプル（Tuple）の使い方 | 値を複数同時に保持する方法 | GENESIS BLOG](https://genesis-tech.jp/blog/how-to-use-tuple/)

------------------------------------------------

#### <font color="green">コンストラクタのオーバーロード</font>
 ##### 「人」を表す Person クラス
```C#
public class Person
{
    // 自動実装プロパティを使用
    public int Age { get; private set; }       // 年齢
    public string Name { get; private set; }   // 名前
    public string Gender { get; private set; } // 性別

    /* 外部からの変更を防ぐため、setのみプライベートに設定 */



    // 引数なしのコンストラクタ
    public Person()
    {
        Age = 0;                   // デフォルト値で年齢を設定
        Name = "ナナシ";           // デフォルト値で名前を設定
        Gender = "どちらでもない"; // デフォルト値で性別を設定
    }

    /* 
        コンストラクタのオーバーロード
        年齢と名前を指定してインスタンスを作成する
     */
    public Person(int age, string name)
    {
        Age = age;                 // 引数で指定された年齢を設定
        Name = name;               // 引数で指定された名前を設定
        Gender = "どちらでもない"; // デフォルト値で性別を設定
    }

    /* 
       コンストラクタのオーバーロード
       年齢、名前、性別を指定してインスタンスを作成する
     */
    public Person(int age, string name, string gender)
    {
        Age = age;                // 引数で指定された年齢を設定
        Name = name;              // 引数で指定された名前を設定
        Gender = gender;          // 引数で指定された性別を設定
    }

    // クラスの内容を表示するメソッド
    public void DisplayInfo()
    {
        /* 
           フォーマット演算子を使用して出力を整形 ※2
           {0:D2} -> Ageを2桁の整数として表示
           {1,-12} -> Nameを左詰めで12文字分の幅に表示
           {2,-10} -> Genderを左詰めで10文字分の幅に表示
         */
        Console.WriteLine($"年齢: {Age:D2}, 名前: {Name,-10}, 性別: {Gender,-10}");
    }
}
````


 ##### クラスから実際に作り出したインスタンス
```C#
class PersonTest
{
    static void Main()
    {
        // 引数なしのコンストラクタを使用してインスタンスを作成
        Person p1 = new Person();
        p1.DisplayInfo();

        // 年齢と名前を指定してインスタンスを作成
        Person p2 = new Person(25, "サトウ");
        p2.DisplayInfo();

        // 年齢、名前、性別を指定してインスタンスを作成
        Person p3 = new Person(30, "タナカ", "男性");
        p3.DisplayInfo();
    }
}
````

 #####  実行結果

````
年齢: 00, 名前: ナナシ       , 性別: どちらでもない
年齢: 25, 名前: サトウ       , 性別: どちらでもない
年齢: 30, 名前: タナカ       , 性別: 男性
````

※2
[【C#】string.Format() をやめて $"{}"（文字列補間式）を使う #C# - Qiita](https://qiita.com/Nossa/items/c2226232b31d7665267f)

--------------------------------------------------------------

## 次回

https://qiita.com/nano357/items/67b9a36be5d1d49d8582

--------------------------------------------------------------
## 参考文献

C#関連情報サイト様

https://note.com/kdtakagi/n/n67b313e1d701

https://www.sejuku.net/blog/100134


--------------------------------------------------------------