【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
抽象クラスとインターフェースの使い分け
調べていくうちに想像より複雑だったため、また別の記事として作成予定。