C# 4.0 C#处理派生类型、重构
我使用的是第三部分.NET库,它包含以下类 形状(抽象基类) (以下所有类别均源自他) 长方形 圈 三角 所有这些类都有一个名为Area的属性 我正在遍历一组形状,并设置区域 注:面积不是形状的属性,而是每个类的属性 因此,我的代码如下所示:C# 4.0 C#处理派生类型、重构,c#-4.0,refactoring,C# 4.0,Refactoring,我使用的是第三部分.NET库,它包含以下类 形状(抽象基类) (以下所有类别均源自他) 长方形 圈 三角 所有这些类都有一个名为Area的属性 我正在遍历一组形状,并设置区域 注:面积不是形状的属性,而是每个类的属性 因此,我的代码如下所示: if (shapeVar is Reactangle) { (shapeVar as Rectangle).area = value; } if (shapeVar is Circle) { (shapeVar as Circle).area
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您可以使用反射来访问每个形状的面积属性,尽管性能成本很低:
shapeVar.GetType().GetProperty("area").SetValue(shapeVar, value, null);
您可以使用反射来访问每个形状的面积属性,但性能成本很低:
shapeVar.GetType().GetProperty("area").SetValue(shapeVar, value, null);
为什么不让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
...
}
}
为什么不让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
...
}
}
您可以包装矩形、圆形和三角形类(来自第三方程序集),并在自己的代码中创建3个新类 然后,您可以有一个接口,例如:
public interface IShape
{
double Area{get;set;}
}
创建包装类以实现此公共接口
之后,您可以在代码中以通用方式使用这三个类,而不必知道它们的实际具体类是什么。(通过引用接口类型而不是形状基类型)您可以包装矩形、圆形和三角形类(来自第三方程序集)并在自己的代码中创建3个新类 然后,您可以有一个接口,例如:
public interface IShape
{
double Area{get;set;}
}
创建包装类以实现此公共接口
之后,您可以在代码中以通用方式使用这三个类,而不必知道它们的实际具体类是什么。(通过引用接口类型而不是形状基类型)作者已经提到所有这些类都来自第三方库。作者已经提到所有这些类都来自第三方库。感谢您的回答。我最终保持了代码的原样。我不想用ReflectionTanks作为答案。我最终保持了代码的原样。我不想使用反射