・クラス・メソッドの分割定義ですが、どういう時に行うのでしょうか。そして、最大何回分割できるのでしょうか。
クラスの定義内容が大きく、長いソースになる場合、
加えて、内容の更新が頻繁に起こるメソッドがある場合、クラス・メソッドの分割定義を検討します。
ソースを分けることにより、役割分担がしやすくなり、見通しが良くなることから、
可読性や保守性が向上します。
しかし、ソースの管理が煩雑になりますので(分割回数に制限はありませんが)
適切な回数にとどめておくと良いでしょう。
・抽象メソッドは基本クラスで宣言をし、派生クラスで実装する必要があるとのことですが、つまりは基本クラスで宣言のみをしてもあまり意味がないという事でしょうか?もしくはそもそも実行できないのでしょうか?
抽象メソッドは「実行用」ではなく「定義用」です。
よって、抽象メソッドを含む抽象クラスは(インターフェイスも)インスタンスを生成できません。
抽象クラスは、主に、派生クラスが複数ある場合に、まとめて扱うための存在です。
そして、派生クラスごとに内容は異なるが、同じシグニチャのメソッドを、
抽象メソッドとして、基本クラス(抽象クラス)に記述しておくことで、
各クラスの整合性を保ち、利用しやすくします。
例えば、Monsterクラスを基本クラス(抽象クラス)として「自分の情報を表示する」Showメソッドを
持たせる場合、表示内容はモンスターの種類により異なるので、抽象メソッドにしておきます。
そして、Monsterクラスの派生クラスのSlimeクラスでShowメソッドを「HPを表示する」とし、
同じく、Monsterクラスの派生クラスのDragonクラスでShowメソッドを「HP,MPを表示する」として
記述します。
すると、SlimeクラスのインスタンスもDragonクラスのインスタンスも、
Monsterクラスのインスタンスとして扱うことができ、どちらもShowメソッドがあることが、
確定します。
このことを、各クラスを使う側から見ると
「Monsterクラスの派生クラスのオブジェクトには、必ずShowメソッドがあるから安心」
「まとめて扱える」というメリットになるわけです。
この例をプログラムにすると以下のようになります。
using System;
abstract class Monster { //抽象クラスMonster
protected int hp = 1; //モンスター共通のインスタンス変数の定義
public abstract void Show(); //抽象メソッド(内容は決められないメソッド)
}
class Slime : Monster { //Monsterの派生クラス①
public override void Show() { //↑のオーバライド
Console.WriteLine("HPは{0}", hp);
}
}
class Dragon : Monster { //Monsterの派生クラス②
int mp = 100;
public override void Show() { //↑のオーバライド
Console.WriteLine("HPは{0}、MPは{1}", hp, mp);
}
}
class abstract01 {
public static void Main() {
Slime slalin = new Slime(); //Slimeクラスのオブジェクト「スラリン」を生成
Dragon veldra = new Dragon(); //Dragonクラスのオブジェクト「ヴェルドラ」を生成
Monster m1 = slalin, m2 = veldra; //上記をMonsterクラスのオブジェクトm1,m2として扱う
m1.Show(); //Monsterクラスの派生クラスなら必ずShowメソッドがある(しかも多態性が起こる)
m2.Show(); //同上
//【以下参考】まとめてあつかえる例
Slime rimuru = new Slime(); //Slimeクラスのオブジェクト「リムル」を生成
Monster[] ms = {slalin, veldra, rimuru}; //上記をMonsterクラスの配列に格納
foreach (Monster w in ms) { //すると、派生クラスのオブジェクトをまとめて扱える
Console.Write("クラスは{0}で、",w);
w.Show(); //必ずShowメソッドがあるので呼び出せる(しかも多態性が起こる)
}
}
}