【C#】継承 [1] (abstract / virtual / override )

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;
    }
}


関連記事

継承 [1] (abstract / virtual / override )

http://blogs.yahoo.co.jp/dk521123/22988220.html

継承 [2] (インターフェイス・interface)

http://blogs.yahoo.co.jp/dk521123/30209838.html