我有以下练习:定义一个名为circle的类,它接受point类型的对象,并计算它们与圆心的距离.如果该点在圆圈之外,则应发送异常通知.
这是我的代码:
class Point
{
protected int x,y;
public Point(int x,int y)
{
this.x = x;
this.y = y;
}
}
class Circle : Point
{
public Circle(Point p,int radius):base(3,5)
{
}
}
class Program
{
static void Main(string[] args)
{
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道在圆圈课上我要做什么,我怎么知道圆点是否在圆圈内?感谢大家.
定义一个名为circle的类,它接受point类型的对象,并计算它们与圆心的距离.如果该点在圆圈之外,则应发送异常通知.
继承与组合:首先,你的类Circle派生出来似乎是错误的Point,只是因为你需要一个x和y你的圆坐标对.请记住,继承通常会模拟"is-a"关系.但圈子不是积分.相反,可以说它们可以通过点(中心)和半径来定义.因此,使用组合("has-a"关系)更合乎逻辑:
class Circle
{
Point center;
double radius;
}
Run Code Online (Sandbox Code Playgroud)
何时使用异常(以及何时不使用):其次,我希望那些给你练习的人实际上并不是throw因为你的距离计算方法Point在圆圈之外得到了一个例外.我会认为这种使用例外无效.例外情况应该用于某些情况,即您的代码无法正确处理的情况.但是,计算两点之间的距离永远不会失败(除非可能出现奇怪的浮点问题,如溢出或下溢):
double DistanceFromCentreTo(Point p)
{
// See e.g. http://en.wikipedia.org/wiki/Pythagorean_theorem:
return Math.Sqrt((center.x - p.x) * (center.x - p.x) +
(center.y - p.y) * (center.y - p.y));
}
Run Code Online (Sandbox Code Playgroud)
如果突然这样的方法引发了异常,那么代码的许多用户可能会认为这不合逻辑.为什么这个方法超出了它的名字所暗示的范围,只是因为距离大于radius?而抛出异常?
IMO更可取的是引入第二种方法:
bool LiesWithinCircle(Point p)
{
return DistanceFromCentreTo(p) <= radius;
}
Run Code Online (Sandbox Code Playgroud)
现在,您有两种方法可以满足大多数人的期望,不会抛出意外的异常,并且仍然提供您最有可能需要的所有功能.
PS:很多天后读了我的答案,它突然让我觉得在Point类上定义上面显示的两种方法会更好,例如:
double DistanceToCenterOf(this Point p, Circle c) { … }
bool LiesWithin (this Point p, Circle c) { … }
Run Code Online (Sandbox Code Playgroud)
...这导致更容易理解的代码; 例如,somePoint.LiesWithin(someCircle)而不是someCircle.LiesWithinCircle(somePoint).