Effective C# 学习笔记(九) 在你的API中避免使用类型转换运算
2011-07-04 20:25 小郝(Kaibo Hao) 阅读(357) 评论(0) 编辑 收藏 举报这里说的转换包括隐式和显示两种转换方式,这两种转换行为都会影响到其转换后行为。
如:有一个类Shape,其作为Circle 和 Ellipse两个类的基类。
代码如下:
//圆形类
public class Circle : Shape
{
private PointF center;
private float radius;
public Circle() : this(PointF.Empty, 0)
{
}
public Circle(PointF c, float r)
{
center = c;
radius = r;
}
public override void Draw()
{
//...
}
//这里“隐式地”定义了圆形到椭圆的转换方法,即用圆形的原点和半径属性重新定一个椭圆对象返回
static public implicit operator Ellipse(Circle c)
{
return new Ellipse(c.center, c.center,c.radius, c.radius);
}
}
//对于结算面积的方法是没有问题的
public static double ComputeArea(Ellipse e)
{
// return the area of the ellipse.
return e.R1 * e.R2 * Math.PI;
}
// call it:
Circle c1 = new Circle(new PointF(3.0f, 0), 5.0f);
ComputeArea(c1);
//但对于压扁的方法就出现了问题
public static void Flatten(Ellipse e)
{
e.R1 /= 2;
e.R2 *= 2;
}
// call it using a circle:
Circle c = new Circle(new PointF(3.0f, 0), 5.0f);
//由于使用了隐式转换,这时圆会转化为椭圆对象传入Flatten方法,但是这只是个创建新的椭圆对象,而不是原来的Circle类对应的圆了,所以对c压扁操作并不起作用
Flatten(c);
//所以需要保存转换后的椭圆对象,代码如下:
// Work with the circle.
// ...
// Convert to an ellipse.
Ellipse e = new Ellipse(c);
Flatten(e);
出处:http://www.cnblogs.com/haokaibo/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。