プログラム 多態性の概念
多態性とは
同じメソッド呼び出し(オブジェクト指向用語的には「メッセージ」という)に対して異なるオブジェクトが異なる動作をすることを言います。
多様性を実現するために、仮想メソッドというものが用意されている。
仮想メソッドとは
virtual修飾子をつけたメソッドのこと
・静的な型、動的な型
派生クラスのインスタンスは基底クラスの変数に格納することができる。
この時、、、、、変数の型を静的な型いい、
実際に格納されているインスタンスの型を動的な型という。
static void Main()
{
// 変数の型
// | 実際に格納するインスタンスの型
// | |
// ↓ ↓ 静的な型, 動的な型
Base a = new Base(); // Base , Base
Base b = new Drived(); // Base , Drived
Drived c = new Drived(); // Drived , Drived
}
静的な意味とは
コンパイル時に型が確定するという意味
変数(newで生成されるインスタンスではなく、単なる入れ物)の型は、宣言時に決まっているので、静的な型になる。
静的な型の情報取得方法:
typeof演算子を用いて取得が可能。
typeof(クラス名)
動的な意味とは
コンパイル時には型が確定せず、実行時に変化する可能性のあるもののことを指します。
(なので、動的な型のことを実行時型(run-time-type)とも言う)(単なる入れ物である)変数とは異なり、インスタンスの型はnewで生成される実行時に決まります。
動的な茅野取得方法:
GetTypeメソッドで取得。
変数名.GetType()
アップキャスト
基底クラスの変数に派生クラスの変数を渡すこと
ダウンキャスト
派生クラスの変数に基底クラスの変数を渡すこと
👇詳細あり
仮想メソッド
仮想メソッドとは
virtual修飾子をつけたメソッドのこと
仮想メソッド
同名のメソッドがある場合
どちらのメソッドが呼び出されるかは静的な型によって決定する。
静的な型と動的な型がある場合
もし、動的な型に基づいて呼び出されるメソッドを決定したい場合があるとすると、virtualという修飾子を付ける。
(ほとんどの場合、メソッド呼び出しは動的に呼び出したほうが都合がいい)
仮想メソッドの利用
例
人間と一口に言ってもいろいろな人がいます。
年齢を聞いても、正直に答える人、鯖を読む人、大体の年齢しか答えない人なそさまざまなタイプがある。
人間という一つのくくりの中で、少しの違いを表現することが出来る。
まとめ
仮想メソッドの利用で変数に格納されているインスタンスの型によって異なる動作をする。
・オーバーライド
仮想メソッドを派生クラスで再定義すること(override)
プログラムの意図しないところでメソッドがオーバーライドされてしまうのを防ぐため、メソッドをオーバーライドする際にはoverride修飾子を明示的に付ける必要がある。