8

この遺伝の質問に対する満足のいく答えを見つけることができないようです。なぜ時々このようなサブタイプを宣言するのですか?

Shape myCircle = new Circle();

そしてこれは他の時?

Circle myShape = new Circle();

Circleは....の子/サブクラスです。Shape

私が読んでいるOOの本と、頭を動かすことができる説明の間で一貫性がないようです。円や正方形などに対してインスタンス化されているShapesクラスの例を人々が見せてくれました...しかし、最初の宣言と2番目の宣言をいつ使用するかはわかりません。

4

3 に答える 3

7

具象クラスのオブジェクトを多態的に処理して、それらを回避できる特定の型への依存関係が作成されないようにすることが望ましい場合がよくあります。たとえば、Circleを描画する目的で作成していて、Draw()がのメソッドである場合、後で正方形に置き換えることにした場合に備えて、形状としてShape宣言することをお勧めします。myCircle

一方、Circleたとえば半径を設定するなど、特定のことを行う場合は、で使用できない可能性があるため、myCircleとして宣言する必要があります。CircleSetRadius()Shape

于 2012-06-08T15:48:30.073 に答える
4

おそらくあなたは形のリストを持っていて、そのリストで行う必要があるのはすべての形(つまり描画)に一般的であるため、それらがどのような形であるかは特に気にしません。これ

List<Shape> shapeList = new List<Shape>();
shapeList.Add(new Circle());
shapeList.Add(new Rectangle());
foreach (Shape shape in shapeList)
{
    shape.Draw();
}

このようにして、実際には異なるタイプであるが共通の親を共有するオブジェクトのシェイプの一般的なメソッドにアクセスできます。次に、サークルに固有のことをしたい場合は、このような同じリストを使用できます。

foreach (Shape shape in shapeList)
{
    if (!(shape is Circle)) continue;
    Circle circle = shape as Circle;
    circle.Radius = 100;
}
于 2012-06-08T15:48:01.020 に答える
1

myCircle@dasblinkenlight の回答に加えて、 objectの動作をCircleのメンバーに制限したいので、2 番目の宣言の代わりに最初の宣言を使用します。

これCircleは、 が のサブクラスでありShape、 のすべてのメンバーShapeが に継承されることを意味しCircle、場合によっては、C# を使用しているためです (また、Java のようにメンバーをオーバーライドすることが常に規則であるとは限りません)。オーバーライドされます。

逆のことはできません。

Circle myCircle = new Shape();

その理由をここに記します

それ以外の場合、2 番目の宣言を使用している場合、 は、 の使用可能なメンバーとメソッドを使用してmyCircle、オブジェクトになります。CircleCircle

于 2012-06-08T16:16:53.507 に答える