0

次のクラスを持つ 3 番目の部分の .NET ライブラリを使用しています。

Shape (抽象基本クラス)

(以下のすべてのクラスは彼から派生したものです)

矩形

サークル

三角形

これらすべてのクラスには Area というプロパティがあります

Shape(s) の配列を調べて、領域を設定します

PS: Area は Shape のプロパティではなく、各クラスのプロパティです。

だから私のコードは次のようになります:

if (shapeVar is Reactangle)
{
   (shapeVar as Rectangle).area = value;
}

if (shapeVar is Circle)
{
   (shapeVar as Circle).area = value;
}

if (shapeVar is Triangle)
{
   (shapeVar as Triangle).area = value;
}

これを行うより良い方法はありますか?ばかげているように感じますが、他に方法が見つかりませんでした

.NET 4 を使用しています

4

3 に答える 3

2

リフレクションを使用して各形状の面積プロパティにアクセスできますが、パフォーマンス コストはわずかです。

shapeVar.GetType().GetProperty("area").SetValue(shapeVar, value, null);
于 2012-05-03T17:36:19.827 に答える
1

Rectangle、Circle、および Triangle クラス (サード パーティのアセンブリに由来する) をラップし、独自のコードで 3 つの新しいクラスを作成できます。

次に、次のようなインターフェイスを使用できます。

        public interface IShape
        {
            double Area{get;set;}
        }

ラップされたクラスを作成して、この共通インターフェースを実装します。

その後、実際の具体的なクラスが何であるかを知らなくても、コード内でこれら 3 つのクラスすべてを共通の方法で使用できます。(Shape ベース型ではなく Interface 型を参照)

于 2012-06-27T08:47:36.077 に答える
0

Areaを、設定する代わりに派生型から戻るメソッドにしないのはなぜですか?

public abstract class Shape
{
    abstract public double Area();
}

public class Square : Shape
{
    double sideLength;
    public double Area
    {
        return sideLength * sideLength;
    }
}

public class Circle : Shape
{
    double radius;
    public double Area
    {
        return Pi * r * r;
    }
}

エリアの設定に固執したい場合は、エリアを基本クラスに移動できます。

public abstract class Shape
{
    public double Area;
}

public class Square : Shape
{
    ...
}

そして、あなたはあなたがすることができる派生したタイプに基づいて領域を設定する形を通して見ます:

foreach (Shape shape in shapes)
    switch(typeof(shape))
    {
        case typeof(Square))
        {
            shape.Area = value; //I imagine this is derived type specific
            ...
        }
    }
于 2012-05-03T18:01:16.543 に答える