はじめてのC#【 09_抽象】

##    はじめに

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

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

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

## 前回

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

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

## <font color="green">抽象クラス</font>
#### 抽象的で不完全なクラスを意味します

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

public abstract class Person
{
    /* 
        「abstract」修飾子を付けることで
        抽象クラスとなります。
        
        age と name のフィールドを持ちます。

        影響力を取得・設定するための
        抽象メソッドを定義しています。
        この抽象メソッドは、
        サブクラスで具体的に実装される必要があります。    
    */

    // フィールド
    private int age;      // 年齢
    private string name;  // 名前

    // コンストラクタ
    public Person(int age, string name)
    {
        this.age = age;
        this.name = name;
    }

    // 抽象メソッドの宣言（影響力を取得・設定）
    public abstract long GetInfluence();
    public abstract void SetInfluence(long influence);

    // getterメソッド
    public int GetAge()
    {
        return age;
    }

    // setterメソッド
    public void SetAge(int age)
    {
        this.age = age;
    }

    // getterメソッド
    public string GetName()
    {
        return name;
    }

    // setterメソッド
    public void SetName(string name)
    {
        this.name = name;
    }

    // displayメソッド
    public virtual void Display()
    {
        Console.WriteLine("年齢は " + age);
        Console.WriteLine("名前は " + name);
    }
}
````


 ##### サブクラス（子クラス）
```C#
/* 
    Influencer クラス
    Person クラスを継承し、
    影響力を保持するための
    フィールドとメソッドを実装しています。
    
    Display メソッドをオーバーライドして、
    親クラスの Display メソッドに影響力の表示を
    追加しています。

    オーバーライドを行う際は、
    override キーワードを使って
    親クラスのメソッドを上書きすることを示しています。
    
    このクラスは「internal」で定義されているため、
    同じアセンブリ内のクラスからのみアクセス可能です。

*/
internal class Influencer : Person
{
    // フィールド
    private long influence;  // 影響力

    // コンストラクタ
    public Influencer(int age, string name, long influence)
        : base(age, name)
    {
        this.influence = influence;
    }

    // 抽象メソッドの実装
    public override long GetInfluence()
    {
        return this.influence;
    }

    public override void SetInfluence(long influence)
    {
        this.influence = influence;
    }

    /* 
        オーバーライドメソッド:
        このメソッドは親クラスのDisplayメソッドを
        オーバーライドしています。
        
        base.Display()を使用して
        親クラスのメソッドを呼び出し、
        その後追加の情報を出力します。
    */
    public override void Display()
    {
        base.Display();  // スーパークラスの Display メソッドを呼び出す
        Console.WriteLine("影響力は " + influence);
    }
}
````


 ##### クラスから実際に作り出したインスタンス
```C#
/* 
    StartClass クラス
    Main メソッドで、Influencer クラスの
    インスタンスを作成し、
    初期の情報と変更後の情報を表示しています。
    
    このクラスは「public」で定義されているため、
    外部からアクセス可能です。
*/

public class StartClass
{
    public static void Main(string[] args)
    {

        // Influencerクラスを元にインスタンス化
        Influencer y = new Influencer(31, "則夫", 990000L);

        // displayメソッドを呼び出し
        y.Display();

        // setterメソッドを使って値を変更
        y.SetAge(17);
        y.SetName("玉姫");
        y.SetInfluence(1000000L);

        // 再度displayメソッドを呼び出し
        y.Display();
    }
}
````

 #####  実行結果

````
年齢は 31
名前は 則夫
影響力は 990000
年齢は 17
名前は 玉姫
影響力は 1000000
````

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

C#関連情報サイト様

https://ufcpp.net/study/csharp/oo_abstract.html#google_vignette

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

https://genesis-tech.jp/blog/how-to-use-this-in-csharp/

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