2017-09-17 11 views
0

私は、子クラスのインスタンスを作成し、それを親クラス型の変数に割り当てることができることを発見しました。私はこのシナリオの周りに頭を包むことはできません。C#での多態性の説明

私のコードでは、インスタンスはHumanクラスですが、ここにあります。

  1. それもどういう意味:それは私がこれについていくつかの疑問を持っているコンソールで、「私は動物だ」

    をログに記録しますか?

  2. どのような結果が得られますか?

  3. なぜ&誰かがこの種のものをいつ行うのですか?

親クラス:

public class Species 
{ 
    public String Shout() 
    { 
     return "I am an animal"; 
    } 
} 

子供クラス:

public class Human : Species 
{ 
    public new String Shout() 
    { 
     return "I am a Human"; 
    } 
} 

インスタンス:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Species h = new Human(); 

     Console.WriteLine(h.Shout()); 
    } 
} 

答えて

6

多面体は、オブジェクト指向プログラミングまたはOOPを効率的に使用する場合に非常に便利です。

あなたが動物園を所有しているとしましょう。この動物園の中にはいくつかの動物がいる(明らかに)。 1つの配列またはリストの中にそれらをすべて格納する場合は、(この場合はAnimal)を使用する必要があります。現在、基底タイプAnimalから派生したクラスは同じプロパティを共有しているため、同じメソッドも同じです。

class Animal 
{ 
    public string Shout() 
    { 
     return "I am an animal!"; 
    } 
} 

ライオンのクラスを宣言しましょう。我々はLionクラス内Shout方法を書いていないにもかかわらず

class Lion : Animal 
{ 
} 

彼らはAnimalクラスからを派生以来、Lionのインスタンスはは、それらに利用可能なShoutメソッドを持つことになります。

LionクラスをShoutに変更したい場合はどうすればよいですか? virtualoverrideのキーワードを使用できます。これらはプロパティとメソッドで使用できます。 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!"を返すことを意味し、基本クラスのインスタンスになります。


DogCat、我々はいくつかのより多くの動物を持っていると言う、と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を返すだけです。

1

ない、あなたの質問に完全に答えていますが、あなたのコードをしたい場合「私は人間です」と表示するには、次のようにします。

親クラス:

public class Species 
{ 
    public virtual String Shout() 
    { 
     return "I am an animal"; 
    } 
    } 

子供クラス:

public class Human : Species 
{ 
    public override String Shout() 
    { 
     return "I am a Human"; 
    } 
} 

ご質問への完全な答えのためには、あなたが本当に多型の教科書や記事をご覧ください。

2

それはどういう意味ですか?

Polymorphismからポリ多くは、モーフ形態

したがって多型多くの形態を有する手段を意味します。オブジェクト指向プログラミングのパラダイムでは、多態性はしばしば「1つのインタフェース、複数の機能」として表現されます。 - Tutorials Point可能な結果と

だけでなく、あなたのコードからは何

:出力がされます

Species h = new Human(); 
Console.WriteLine(h.Shout()); //calling Shout method of Species 

I am an animal

ここでは、Shoutメソッドを呼び出していますSpecies(親親)のHuman(子)のインスタント・イニシャルng hからタイプSpecies。とき誰かがあなたの例からももの

のこの種を行うだろうあなたは出力がされますcasting

Console.WriteLine(((Human)h).Shout()); //calling Shout method of Human 

の助けを借りてHumanshout方法を&を呼び出すことができますなぜ

I am an human。ここで

私はあなたにもh as Humanを行うことができ、その後、あなたがHumanクラスのShoutメソッドを呼び出して読みやすくするために、この((Human)h)を行うことによってHumanとしてhをキャスト。

Console.WriteLine((h as Human).Shout()); //calling Shout method of Human 

チェックFiddle


PS:あなたも@Willemあなたは新しい使用しないでください

言ったことに注意を払うべきです。しかしシャウト仮想するとヒト


のシャウト基本的多型は、同じ名前の(オーバーライドおよび仮想使用状況を確認)過負荷方法を行うが、パラメータとして異なるデータ型を有しているにオーバーライドを使用するか、または異なるデータ型それ自身、子クラス内、親クラス内または子と親の間

0

例として、イメージングでは、オブジェクトに対して特定のアクションが必要なプログラムを作成しています。オブジェクトは前にこのプログラムを通過したかもしれませんが、別のルートに進む必要があります。多態性を使用するように設定し、変更する必要のあるメソッドをオーバーライドすることができます。例:

イメージングProcessPictureのオーバーライドを持つImageProcessの基本クラス。

ProcessPictureは、レビュー前または別のプログラムでデータが取り出される前に、トリミングやクリーンアップを行うことがあります。プログラムはそれを送り返しますが、今度はProcessPictureがウォーターマークを追加する必要があります。

このようにして、画像のステータスに応じて1つのプログラムで異なるタスクを実行させることができます。

+0

これは技術的には正しいと思いますが、抽象化がプログラミングにどのように関係しているか、また実際のプロセスがコード形式か抽象化されたビジネス例' 形。 – TylerH