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)); //多態性がなく和になる
}
}