C#_abstract とは

 ・abstract キーワードで宣言する。

・abstract 宣言されたならば、派生クラスで必ず実装

・派生クラスにて足りない機能を実装した上で、インスタンス
  生成しなくてはならない。

 

抽象クラス

インスタンス化できないクラス
他のクラス ( 派生クラス ) のベースとなるだけという宿命のもとに
誕生したクラス。

 

抽象メソッド

メソッドの意味 ( 規約 ) だけを定義したメソッド。
派生クラスで具体的な実装を行う。抽象クラスの中に記述する。

 

ex ) コード
基底クラス

    abstract class Base
    {
        public abstract void Request();
    }

 

派生クラス

    class Sub : Base
    {
        public override void Request()
        {
            // 処理
        }
    }

 

呼び出し元

    public class Main
    {
        Sub sub = new Sub();
        sub.Request();

        //↓NG.
        //Base bas = new Base();
    }

 

abstract は何を解決しているのか

Base クラスで意味のない値を返さず、派生クラスで実装する場合。

1 )

Base を継承せずにインスタンスを生成すると
(Base のインスタンスを作成すると)、
意味のない値を返すメソッドを持つクラスのインスタンスが生成されてしまい、
好ましくない。

2 )

1 ) の解決策として、外部から Base クラスのインスタンス
生成できないようにする為、
Base クラスのコンストラクタを protected にする。

だが、Sub クラスでしっかりとオーバーライドしなければ
無意味な値が返されてしまう。

これを解決する為、
インスタンスを生成できないクラス、
派生クラスで必ずオーバーライドしなければならないメソッドの定義
する為に構文 abstract がある。

 

オーバーライド:
基底クラスで定義したメソッドを、その派生クラスで再定義すること。

 

+α
何故インスタンス化できないのか

現実世界では、「犬」というインスタンスはない。
犬をベースとして柴犬、秋田犬などの種類、これらのインスタンスを見ている。
犬を見ているのではなく、犬を継承した各種類の犬を見ている。

プログラムは実世界を落とし込んでいるので、
「犬」であるBase のインスタンスが生成されたらおかしいよね、
ということだと思う。

 

こちら参照。

http://ufcpp.net/study/csharp/oo_abstract.html
http://www.kisoplus.com/kihon/tyu.html

 

 以上。