はじめてのC#【 08_継承】

##    はじめに

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

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

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

## 前回

https://qiita.com/nano357/items/3029d1dbb8ded767e321#comment-1ca2ae6fb8b0fe5ddccf

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

## <font color="green">継承</font>
#### クラスの機能を受け継いで新しいクラスを作ること

 ##### スーパークラス（親クラス）
```C#
using System;

/**
 * 「人」を表す Person クラス
 */
public class Person
{

    // 自動実装プロパティ
    public int Age { get; set; }
    public string Name { get; set; }

    /*
       AgeとNameのプロパティを定義。
       getアクセサでフィールドの値を取得し、
       setアクセサでフィールドの値を設定する。 */


    // コンストラクタ
    public Person(int age, string name)
    {
        Age = age;   // 年齢を初期化
        Name = name; // 名前を初期化
    }

    /* インスタンスが作成される際に、
       指定された年齢と名前で初期化する */

}
````


 ##### サブクラス（子クラス）
```C#
/**
 * 「従業員」を表す Employee クラス
 */
public class Employee : Person
{
    // 自動実装プロパティ
    public int EmployeeID { get; set; }

    /* EmployeeIDプロパティを定義。
       従業員IDを格納する。 */

    // コンストラクタ
    public Employee(int age, string name, int employeeID)
        : base(age, name)  // 親クラスのコンストラクタを呼び出す
    {
        EmployeeID = employeeID; // 従業員IDを初期化
    }

    /* 親クラスの age と name を初期化し、
       EmployeeID を設定する。
       base キーワードを使用して、
       親クラス（Person）のコンストラクタを呼び出す。 */

}
````


 ##### インスタンス化とテスト
```C#
public class EmployeeTest
{
    public static void Main(string[] args)
    {
        // Employee クラスのインスタンスを作成
        Employee p = new Employee(25, "田中 太郎", 111);
        
        /* 年齢25、名前「田中 太郎」、従業員ID 111 で初期化 */


        // プロパティの値を表示
        Console.WriteLine(p.Age);         // 25
        Console.WriteLine(p.Name);        // 田中 太郎
        Console.WriteLine(p.EmployeeID);  // 111
    }
}
````

 #####  実行結果

````
25
田中 太郎
111
````

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

## <font color="green">コンストラクタの継承</font>
```C#
using System;

//SampleApplication1 名前空間
namespace SampleApplication1
{
    /* 
       この名前空間は、
       Person クラスと Employee クラスを含んでいます。

       名前空間は、クラスや他の型をグループ化し、
       コードの整理と管理を容易にします。

       名前空間を使うことで、クラス名の衝突を避け、
       コードの構造を明確に保つことができます。
     */


    /**
     * 「人」を表す スーパークラスPerson （親クラス）
     */
    class Person
    {
        // プロパティ
        public string Name { get; set; }

        /* 
          Person クラスのコンストラクタは、
          名前を引数として受け取り、
          プロパティ Name に設定します。
         */
        public Person(string name)
        {
            Name = name;
            Console.WriteLine("Person コンストラクタ: 名前 = " + name);
        }
    }

    // Person クラスを継承した、サブクラスEmployee（子クラス）
    class Employee : Person
    {
        // プロパティ
        public int ID { get; set; }

        /* 
          Employee クラスのコンストラクタは、
          名前と ID を引数として受け取ります。
         
          このコンストラクタは、base(name) を使用して
          親クラス Person のコンストラクタを呼び出します。

          その後、子クラスのプロパティ ID を設定します。

         */

        public Employee(string name, int id) : base(name)
        {
            ID = id;
            Console.WriteLine("Employee コンストラクタ: 名前 = " + name + ", ID = " + id);
        }

        public static void Main()
        {
            // Employee クラスのインスタンスを作成
            Employee employee = new Employee("佐藤", 12345);

            /* 
              コンストラクタが呼び出される順序は以下

                1. Employee クラスのコンストラクタが呼び出されると、
                   まず親クラス Person のコンストラクタが呼び出されます。

                2. Person のコンストラクタが実行された後に、
                   Employee のコンストラクタが実行されます。

                3. 結果として、コンストラクタの呼び出し順序は「親 > 子」となり、
                   親クラスのコンストラクタが優先的に実行されます。
             */

        }
    }
}
````

 #####  実行結果

````
Person コンストラクタ: 名前 = 佐藤
Employee コンストラクタ: 名前 = 佐藤, ID = 12345
````

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

## <font color="green">明示的に親クラスのコンストラクタを呼ぶ</font>
```C#
using System;

// SampleApplication1 名前空間
namespace SampleApplication1
{
    /**
     * 「人」を表す スーパークラス Person（親クラス）
     */
    class Person
    {
        // プロパティ
        public string Name { get; set; }
        public int Age { get; set; }

        /* 
          Person クラスのコンストラクタは、
          名前を引数として受け取り、
          プロパティ Name に設定します。
         */
        public Person(string name)
        {
            Name = name;
            Console.WriteLine("Person コンストラクタ: 名前 = " + name);
        }

        /* 
          もう一つのコンストラクタは、
          名前と年齢を引数として受け取り、
          プロパティ Name と Age に設定します。
         */
        public Person(string name, int age)
        {
            Name = name;
            Age = age;
            Console.WriteLine("Person コンストラクタ: 名前 = " + name + ", 年齢 = " + age);
        }
    }

    // Person クラスを継承した、サブクラス Employee（子クラス）
    class Employee : Person
    {
        // プロパティ
        public int ID { get; set; }

        /* 
          Employee クラスのコンストラクタは、
          名前、年齢、および ID を引数として受け取ります。
         
          このコンストラクタは、base(name, age) を使用して
          親クラス Person のコンストラクタを呼び出します。

          その後、子クラスのプロパティ ID を設定します。
         */
        public Employee(string name, int age, int id) : base(name, age)
        {
            ID = id;
            Console.WriteLine("Employee コンストラクタ: 名前 = " + name + ", 年齢 = " + age + ", ID = " + id);
        }

        public static void Main()
        {
            // Employee クラスのインスタンスを作成
            Employee employee = new Employee("佐藤", 30, 12345);

            /* 
              コンストラクタが呼び出される順序は以下

                1. Employee クラスのコンストラクタが呼び出されると、
                   まず親クラス Person のコンストラクタが呼び出されます。
                   この場合、Person(string name, int age) コンストラクタが呼び出されます。

                2. Person のコンストラクタが実行された後に、
                   Employee のコンストラクタが実行されます。

                3. 結果として、コンストラクタの呼び出し順序は「親 > 子」となり、
                   親クラスのコンストラクタが優先的に実行されます。
             */
        }
    }
}
````

 #####  実行結果

````
Person コンストラクタ: 名前 = 佐藤, 年齢 = 30
Employee コンストラクタ: 名前 = 佐藤, 年齢 = 30, ID = 12345
````

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

## 次回

https://qiita.com/nano357/items/75c41dbebf6fa33db931

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

C#関連情報サイト様

https://ufcpp.net/study/csharp/oo_inherit.html

https://csharp.sevendays-study.com/ex-day3.html

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

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