我正在使用具有以下类的第三方.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
答案 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
...
}
}