Effective C# 学习笔记(九) 在你的API中避免使用类型转换运算

本文详细解析了一个类作为基类时,通过隐式转换导致的方法调用失效的问题,并提出了解决方案。具体场景涉及圆形类到椭圆类的转换,在调用压扁方法时,由于转换导致的对象类型改变,使得原圆形对象无法被正确处理。为解决此问题,文章建议在调用方法前保存转换后的对象,确保后续操作的对象保持原始类型。

这里说的转换包括隐式和显示两种转换方式,这两种转换行为都会影响到其转换后行为。

如:有一个类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);

转载于:https://www.cnblogs.com/haokaibo/archive/2011/07/04/2097710.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值