例外 - 基本练习

Ric*_*ter 0 c#

我有以下练习:定义一个名为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)

我不知道在圆圈课上我要做什么,我怎么知道圆点是否在圆圈内?感谢大家.

sta*_*ica 7

定义一个名为circle的类,它接受point类型的对象,并计算它们与圆心的距离.如果该点在圆圈之外,则应发送异常通知.

继承与组合:首先,你的类Circle派生出来似乎是错误的Point,只是因为你需要一个xy你的圆坐标对.请记住,继承通常会模拟"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).