C#处理派生类型,重构

时间:2012-05-03 17:32:05

标签: c#-4.0 refactoring

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

Shape(抽象基类)

(以下所有来自他的课程)

矩形

三角

所有这些类都有一个名为Area

的属性

我正在浏览一组Shape(s),并设置区域

P.S: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

3 个答案:

答案 0 :(得分:2)

您可以使用反射来访问每个形状的区域属性,但性能成本很低:

shapeVar.GetType().GetProperty("area").SetValue(shapeVar, value, null);

答案 1 :(得分:1)

您可以包装Rectangle,Circle和Triangle类(来自第三方程序集)并在您自己的代码中创建3个新类。

然后你可以有一个接口,例如:

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

使包装类实现此通用接口。

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

答案 2 :(得分:0)

为什么区域不是从派生类型返回而不是设置的方法?

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