講義メモ 後半

p.250 クラスを分割定義する

・1クラスを複数のソースリストで記述できる
・これにより、ソースの長大化を防いだり、チーム開発を効率化できる
・テキストではクラス定義を2分割して1ソースに置いているが、通常、ソースの分割に用いる
・クラスを分割定義するには、classの前に partial を付記する(これを部分クラスともいう)
・部分クラスのどこかで定義したメンバは、他のソースにある部分クラスからも利用可能
・ビルドにより分割クラスは1つになり、1つの実行ファイルが生成される
・なお、クラスを分割定義している場合は、VisualStudioの「ファイル」「すべて保存」を用いて、一部ファイルの保存モレを防止すると良い

アレンジ演習:p.250 partial01.cs

・018行目までをpartial01.csに、020行目以降をpartial01a.csに分離しよう
・なお、「using System;」は両方またはどちらか片方で必要に応じて配置すること
・1つのプロジェクトにpartial01.csファイルがある状態で、そこに、ソースファイルを追加すれば良い

作成例:partial01.cs(分割元)

//アレンジ演習: partial01.cs
using System;
partial class MyClass { //部分クラス MyClassクラス①
    public int x;
}
class partial01 { //通常クラス
    public static void Main() {
        MyClass mc = new MyClass(); //部分クラスを結合した状態で扱う
        mc.x = 10;
        mc.Show();
    }
}

作成例:partial01.cs(分割先)

//アレンジ演習: partial01a.cs
using System; //こちらにも必要(自動生成されることもある)
partial class MyClass { //部分クラス MyClassクラス②
    public void Show() {
        Console.WriteLine("x = {0}", x);
    }
}

p.251 メソッドを分割定義する

・分割したクラスにおいて、メソッドの宣言と定義を別々の部分クラスに記述できる
・これを部分メソッドといい、メソッドの冒頭に「partial」を指定する
・ただし、戻り値型がvoidで、privateなメソッドに限る
・部分メソッド宣言の書式: partial void メソッド名(引数型 引数名, …);
・部分メソッド定義の書式: partial void メソッド名(引数型 引数名, …){…}
※ この仕掛けは未完成のメソッドがある場合に便利で、 シグニチャだけを部分メソッドとして記述しておくと良い
※ 1メソッドを複数ソースファイルで分割記述できるわけではない

アレンジ演習:p.251 partialmethod01.cs

・020行目までをpartialmethod01.csに、021行目以降をpartialmethod01a.csに分離しよう
・なお、「using System;」は両方またはどちらか片方で必要に応じて配置すること
・1つのプロジェクトにpartialmethod01a.csファイルがある状態で、そこに、ソースファイルを追加すれば良い

作成例:partialmethod01.cs(分割元)

// partialmethod01.cs
using System;
partial class Partialmethod01 {
  public static void Main() {
    Console.WriteLine("Mainメソッドです");
    Partialmethod01 pm = new Partialmethod01();
    pm.Func1();
    pm.Func2("テスト");
  }
  //ここではメソッドの中身を記述していない
  //戻り値はvoid型、privateでなくてはだめ
  partial void Func1(); //宣言のみ
  partial void Func2(string s); //宣言のみ
}

作成例:partialmethod01a.cs(分割先)

using System;
partial class Partialmethod01 {
  partial void Func1(){ //定義を含む
    Console.WriteLine("パーシャルメソッド1です");
  }
}
partial class Partialmethod01 {
  partial void Func2(string s) { //定義を含む
    Console.WriteLine("引数は「{0}」です", s);
  }
}

p.254 ex0901.cs/ex0902.cs 練習問題1,2:ヒント

・p.231 override01.csをベースにすると良い
・Mainメソッドの作例:
  A2 a2 = new A2(); //派生クラスのインスタンスを生成
  Console.WriteLine(a2.Calc(5, 8)); //差を表示?
  A1 a1 = a2; //基本クラス型の変数にインスタンスを代入
  Console.WriteLine(a1.Calc(5, 8)); //和を表示? 差を表示?

作成例: 練習問題1

//p.254 ex0901.cs 練習問題1
using System;
class A1 { //基本クラス
    public virtual int Calc(int x, int y) { //オーバーライドを許可する仮想メソッド
        return x + y; //和を返す
    }
}
class A2 : A1 { //派生クラス
    //ここに「public virtual int Calc(int x, int y){…}」があるが、下記にオーバーライドされる
    public override int Calc(int x, int y) { //オーバーライドメソッド
        return (x > y) ? x - y : y - x; //差を返す
    }
}
class ex0901 {
    public static void Main() {
        A2 a2 = new A2(); //派生クラスのインスタンスを生成
        Console.WriteLine("a2.Calc(10, 30) = {0}", a2.Calc(10, 30)); //差になる
        A1 a1 = a2; //基本クラスの整数にインスタンスを渡す
        Console.WriteLine("a1.Calc(10, 30) = {0}", a1.Calc(10, 30)); //多態性で差になる
    }
}

作成例: 練習問題2

//p.254 ex0902.cs 練習問題2
using System;
class A1 { //基本クラス
    public int Calc(int x, int y) { //通常メソッド(継承可能)
        return x + y; //和を返す
    }
}
class A2 : A1 { //派生クラス
    //ここに「public int Calc(int x, int y){…}」があるが、下記に「名前の隠ぺい」される
    new public int Calc(int x, int y) { //名前の隠ぺい
        return (x > y) ? x - y : y - x; //差を返す
    }
}
class ex0901 {
    public static void Main() {
        A2 a2 = new A2(); //派生クラスのインスタンスを生成
        Console.WriteLine("a2.Calc(10, 30) = {0}", a2.Calc(10, 30)); //差になる
        A1 a1 = a2; //基本クラスの整数にインスタンスを渡す
        Console.WriteLine("a1.Calc(10, 30) = {0}", a1.Calc(10, 30)); //多態性がなく和になる
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です