例外 - 基本练习

时间:2011-06-30 10:49:22

标签: 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)
    {

    }
}

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

5 个答案:

答案 0 :(得分:7)

  

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

继承与构成:首先,您的班级Circle来自Point似乎是错误的,因为您需要x和{{1你圈子的坐标对也是如此。请记住,继承通常会模拟“is-a”关系。但圈子不是积分。相反,可以说它们可以通过点(中心)和半径来定义。因此,使用组合(“has-a”关系)更符合逻辑:

y

何时使用例外(以及何时不使用):其次,我希望那些给你练习的人实际上并不是因为你的距离计算而class Circle { Point center; double radius; } 例外方法得到一个位于圆圈外的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)); } 而引发异常?

IMO更可取的是引入第二种方法:

radius

现在,您有两种方法可以满足大多数人的期望,不会抛​​出意外的异常,并且仍然提供您最有可能需要的所有功能。


PS:多天后阅读我的答案,我突然觉得最好定义bool LiesWithinCircle(Point p) { return DistanceFromCentreTo(p) <= radius; } 类上面显示的两种方法,例如:

Point

...这导致更容易理解的代码;例如double DistanceToCenterOf(this Point p, Circle c) { … } bool LiesWithin (this Point p, Circle c) { … } 代替somePoint.LiesWithin(someCircle)

答案 1 :(得分:2)

  

我怎么知道这一点是否在   是否圈?

  1. 计算点与中心之间的距离。
  2. 如果它大于半径,则它在外面。

答案 2 :(得分:1)

这将告诉您是否在圈内:

class Point
{
    protected int x,y;
    public Point(int x,int y)
    {
        this.x = x;
        this.y = y;
    }

    public int X { get { return x; } }
    public int Y { get { return y; } }
}
圆圈的构造函数中的

public Circle(Point p,int radius):base(3,5)
{

    if ( Math.Sqrt( Math.Pow( p.X - this.X, 2.0) + Math.Pow( p.Y - this.Y, 2.0)) > radius )
       throw new ArgumentException("This point is outside the circle");
}

答案 3 :(得分:1)

应该是这样的,假设你只询问异常并且已经知道计算距离所涉及的逻辑:

class Circle
{
    public Circle(Point p,int radius)
    {
        //code to construct the circle here..
    }

    public double DistanceFromCenter(Point p)
    {
        if (p is outside circle)
            throw new Exception("Point " + p + " is outside the circle");
        //calculate the distance and return it...
    }
}

答案 4 :(得分:0)

如果x ^ 2 + y ^ 2 &lt; = R ^ 2

,则原点上半径为R的圆为x^2+y^2=R^2该点为圆形