2012-06-08 8 views
7

私はこの継承の質問に対して満足のいく答えを見つけることができないようです。このようなサブタイプを宣言する理由は次のとおりです。c#スーパークラスとしてサブクラスを宣言する

Shape myCircle = new Circle(); 

とこれ以外の時期は何ですか?サークルは、子/サブクラスShapeある

Circle myShape = new Circle(); 

.....

私が読んでいるOOの書籍や解説I間の一貫性があるように思えません。私の周りに頭を上げることができます。人々は私に、円、四角などのためにインスタンス化されたShapesクラスの例を示しました...しかし、第1宣言と第2宣言を使用するときはわかりません。

答えて

3

多分あなたはシェイプのリストを持っていて、あなたがそのリストで行う必要があるものがすべてのシェイプ(すなわち描画)に一般的なので、シェイプの種類は気にしません。

このようにして、実際に異なるタイプで共通の親を共有するオブジェクトの図形の一般的な方法にアクセスできます。サークルに固有の何かをしたい場合は、このような同じリストを使うことができます。

foreach (Shape shape in shapeList) 
{ 
    if (!(shape is Circle)) continue; 
    Circle circle = shape as Circle; 
    circle.Radius = 100; 
} 
7

あなたがそれらを避けることができ、特定の種類の依存関係を作成しないように具体的なクラスpolymorphicallyのオブジェクトを処理することが望ましい場合が多いです。たとえば、図面を描画する意図でCircleを作成し、Draw()Shapeのメソッドである場合は、後で正方形で置き換えることを決めた場合は、myCircleを図形として宣言することをお勧めします。一方

あなたの意図は、たとえば、Circleに特定の何かをするために、その半径を設定している場合、あなたはSetRadius()Shapeで利用できない場合がありますので、CircleとしてmyCircleを宣言する必要があります。

1

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

CircleShapeのサブクラスであり、そしてそれはあなたがC#を使用して(とメンバーをオーバーライドしていることは、常にではないのでShapeのすべてのメンバーが、いくつかのケースでは、Circleによって継承され、されることを意味しているためですJavaのようなルール)がオーバーライドされます。

あなたは反対のことを行うことはできません。

Circle myCircle = new Shape(); 

理由はhereに記載されています。

それ以外の場合、myCircleCircleのメンバーとメソッドを使用してCircleオブジェクトになります。

関連する問題