【C#】抽象クラス・インターフェース

前提

C#の抽象クラス・インターフェースの話

抽象クラス

  • 定義
    インスタンスを生成出来ないクラスで、継承して利用することを前提としたクラス
    ※継承...クラスの共通部分を別クラス(A)にまとめ、Aを継承することでAのプロパティ・メソッドを継承先で宣言することなく利用できる仕組み

  • ポイント

    • クラスやメソッドの前にabstractキーワードを付ける
    • 抽象クラスの中の抽象メソッドでは処理を書かず定義だけ行い、処理は継承先の具象クラスで書く必要がある
    • 継承できる抽象クラスは1つのみ(抽象クラスに限らず、具象クラスを継承する際も継承可能なクラスのは1つ)
  • 実装例

public class Test{
    public static void Main(){
        
        var normal = new NormalUser();
        var str1 = normal.GetUserClassName();
        
        var admin = new AdminUser();
        var str2 = admin.GetUserClassName();
        
        System.Console.WriteLine(str1);
        System.Console.WriteLine(str2);
    }
}

abstract class AbstractUser {//抽象クラス
   abstract public string GetUserClassName(); //抽象メソッド
}

class NormalUser : AbstractUser {//抽象クラスを継承
    public override string GetUserClassName(){//抽象メソッドをオーバーライド
        return "NormalUser";
    }
}

class AdminUser : AbstractUser {//抽象クラスを継承
    public override string GetUserClassName(){//抽象メソッドをオーバーライド
        return "AdminUser";
    }
}
//出力結果
NormalUser
AdminUser

インターフェース

  • 定義
    メソッドの実装を強制し、機能を追加するための仕組み

  • ポイント

    • classではなく、interefaceキーワードを付ける※アクセス修飾子はpublic固定
    • インターフェースを実装したクラスは、インターフェースの処理を実装しなければいけない(抽象メソッドと同じ)
    • 複数のインターフェースの継承が可能
  • 実装例
public class Test{
    public static void Main(){
        
        var user = new User();
        var str1 = user.GetId();
        
        var product = new Product();
        var str2 = product.GetId();
        
        System.Console.WriteLine(str1);
        System.Console.WriteLine(str2);
    }   
}
interface IGetId{//インターフェース
    int  GetId();
}

class User : IGetId {
    public int GetId(){//インターフェースのメソッドを実装
        var userId = 1;//本来はUserテーブルにidを取得しに行くが、ここでは仮に定義
        return userId;
    }
}

class Product : IGetId {//インターフェースのメソッドを実装
    public int GetId(){//インターフェースのメソッドを実装
        var productId = 2;//本来はProductテーブルにidを取得しに行くが、ここでは仮に定義
        return productId;
    }
}
//出力結果
1
2

抽象クラスとインターフェースの使い分け

調べていくうちに想像より複雑だったため、また別の記事として作成予定。

参考