0

我正在使用具有以下类的第三方 .NET 库。

形状(抽象基类)

(以下所有类都源自他)

长方形

圆圈

三角形

所有这些类都有一个名为 Area 的属性

我正在浏览一组形状,并设置区域

PS:面积不是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

您可以使用反射来访问每个形状的 area 属性,尽管性能开销很小:

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;}
        }

使包装的类实现这个通用接口。

之后,您可以在代码中以通用方式使用所有这三个类,而无需知道它们的实际具体类是什么。(通过引用接口类型而不是 Shape 基本类型)

于 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 回答