abstract
抽象クラスとインターフェイスとの違い
(1) 実装内容のないメソッドだけでなく、内容を含むメソッド(下のサンプルの場合、GetName())を記述できる(2) 抽象クラスは、二つ以上継承できない。つまり、多重継承できない。(インターフェイスは二つ以上でも継承できる)
抽象クラスとインターフェイスの使い分け
* 抽象クラス : 抽象化したいのがクラスの場合* インターフェイス : 単なる振る舞いに関する制約の場合
参考資料
http://blog.shos.info/archives/2005/02/c_tips_interface_abstract_clas.htmlサンプル
抽象クラス ( SampleAbstract.cs )
// ★ポイント1★ abstractで抽象クラスを定義 public abstract class SampleAbstract { public string GetName(string value) { return value; } // ★ポイント2★ abstractで抽象メソッドを定義(実装内容は書かず、定義だけ) public abstract int GetValue(int value); }
抽象クラスを継承したクラス ( Class1.cs )
// ★ポイント1★ 抽象クラス「SampleAbstract」を継承 class Class1 : SampleAbstract { // ★ポイント2★ 抽象メソッド「GetValue」をオーバーライド(override)する public override int GetValue(int value) { return value * 2; } }
virtual / override
* ★重要★ もしかしたら置き換えられるかもしれないメソッドに、あらかじめvirtualキーワードを付けておく* virtualキーワードを付けておかないと、overrideキーワードだけ付けてもコンパイル・エラーになってしまう
* 機能的によりオーバーライドを要請するケースが存在する場合に使用する(特に必要とされないかぎり、virtualキーワードは使わない)
サンプル
抽象クラス ( SampleAbstract.cs )
public abstract class SampleAbstract { public virtual int GetAge(int age) { return age; } }
抽象クラスを継承したクラス ( Class1.cs )
class Class1 : SampleAbstract { public override int GetAge(int age) { return age - 3; } }