あなたが動物園を所有しているとしましょう。この動物園の中にはいくつかの動物がいる(明らかに)。 1つの配列またはリストの中にそれらをすべて格納する場合は、(この場合はAnimal
)を使用する必要があります。現在、基底タイプAnimal
から派生したクラスは同じプロパティを共有しているため、同じメソッドも同じです。
Lion
クラスをShout
に変更したい場合はどうすればよいですか? virtual
とoverride
のキーワードを使用できます。これらはプロパティとメソッドで使用できます。 virtual
は、メソッドまたはプロパティがをオーバーライドすることを意味し、override
は実際のオーバーライドを実行します。両方がうまく動作するように設定する必要があります。
Shout
メソッドをオーバーライドするには、最初にvirtual
とマークする必要があります。
public virtual string Shout() { ... }
今、私たちのLion
クラスでは、我々はShout
方法にオーバーライドを行うことができます。
public override string Shout()
{
return "Rooooaaar, I am a lion!";
}
今、私たちはこのことを明確にすることを、のは、それのいくつかの使い方を見てみましょう。
Lion lion1 = new Lion();
これは、クラスのコンストラクタを呼び出すことによってLion
クラスの新しいインスタンスを作成します。 と今呼び出すと、返される値は"Rooooaaar, I am a lion!"
になります。
Animal animal1 = new Lion();
これも機能します。 Lion
クラスは基底タイプAnimal
から派生しているため、オブジェクトはAnimal
のオブジェクトの内部に格納できます。しかし、だまされてはいけません! animal1.Shout()
と今電話すると、まだ"Rooooaaar, I am a lion!"
が返されます。
Animal animal2 = new Animal();
これはちょうど方法animal2.Shout()
が"I am an animal!"
を返すことを意味し、基本クラスのインスタンスになります。
今Dog
、Cat
、我々はいくつかのより多くの動物を持っていると言う、とLion
のをしてみましょう。多型を使用しないと、共通のものがないので、それらを単一の配列の中に格納することはできませんでした。上記のこれらのすべては完全に正常に動作します
List<Animal> animals = new List<Animal>();
animals.Add(new Cat());
animals.Add(new Dog());
animals.Add(new Lion());
animals.Add(new Animal());
:彼らはAnimal
クラスから派生行う場合は、私たちはこのような何かを行うことができます!
最後に、あなたがこのAnimal
リストから要素を取得したいとあなたはそれにいくつかのDog
固有のメソッドを呼び出したい場合は、することができます(それは実際にはもちろんのDog
オブジェクトの場合)に変換するanimals[1] as Dog
を使用Dog
オブジェクトです。ただし、Dog
オブジェクトでない場合は、as
演算子からnull
を返すだけです。
これは技術的には正しいと思いますが、抽象化がプログラミングにどのように関係しているか、また実際のプロセスがコード形式か抽象化されたビジネス例' 形。 – TylerH