Continuousで始めるC# / Xamarin 004 [ Draft ]
メソッドのオーバーロード
引数の個数や型が異なるけれど同じ名前のメソッドを作ることをメソッドのオーバーロードと言います。前回作ったコンストラクタは、以下のように、firstName, lastName, bloodTypeという3つの文字列を渡していました。
public Person( string firstName = "unknown", string lastName = "unknown", string bloodType = "unknown" ) { FirstName = firstName; LastName = lastName; BloodType = bloodType; }
もうすでにPersonクラスのインスタンスがあって、これと同じインスタンスを作りたい場合は、もとになるPersonのインスタンスを渡せるコンストラクタがあると便利ですね。
ということで、書いてみると以下のようになります。メソッド名は同じですが、引数リストが異なるため二重定義のエラーになることはありません。
public Person(
Person person
) {
FirstName = person.FirstName;
LastName = person.LastName;
BloodType = person.BloodType;
}
呼び側のコードは以下のとおり。
Person p1 = new Person( firstName : "Taro", lastName : "Ito" ); // p1の複製を作る Person p2 = new Person( p1 );
静的フィールドや静的メソッド
例えば、全てのPersonのインスタンスにユニークなidを付けたいとします。コンストラクタが呼ばれるたびに0から1ずつカウントアップしてidにしましょう。
この値を保持するのは、インスタンスの中では都合が悪いので、クラス自身に持つことになります。クラス内のグローバル変数のようなものですね。
この場合、フィールドの宣言の先頭にstaticと書きます。
public class Person { // *1 クラスに属するフィールド static private int id = 0; // *2 クラスに属するメソッド / プロパティ public static int Id { get { return id; } } public Person( string firstName = "unknown", string lastName = "unknown", string bloodType = "unknown" ) { FirstName = firstName; LastName = lastName; BloodType = bloodType; id++; // *3 カウントアップ }
- 1 : この例ではstatic privateとしていますので、外からは見えませんが、static publicとすれば、Person.idでアクセスできるようになります。CLASS_NAME.FIELD_NAMEでアクセスできます。
- 2 : フィールドを生で公開したくなければ、staticなメソッド、もしくはプロパティを作ればよいです。Person.Idで値を取得できます。CLASS_NAME.METHOD_NAMEの形ですね。