定義接受型點的對象一類命名爲圓形,並計算它們與圓心的距離。如果該點在圈外應該發送異常通知。
繼承與組成:首先,它似乎是錯誤的,你的Circle
類從Point
派生,只因爲你需要一個x
和y
座標對你的圈子了。請記住,繼承通常模擬「是 - 一個」關係。但圈子不是要點。相反,可以說它們可以通過一個點(中心)和一個半徑來定義。因此,這將是更符合邏輯可用的組合物(「有」的關係):
class Circle
{
Point center;
double radius;
}
當使用異常(以及何時不):第二,我希望誰給你的練習沒」 t實際上意味着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));
}
如果突然這樣的方法拋出一個異常,你的代碼的很多用戶可能會考慮這個unlogical。爲什麼這種方法超出其名稱所建議的範圍,只因距離大於radius
而拋出異常?
這將是更明智IMO引入第二種方法:
bool LiesWithinCircle(Point p)
{
return DistanceFromCentreTo(p) <= radius;
}
現在你有兩個方法,無論怎麼做多數人的期待,不亂扔意外的異常,並仍然提供所有功能,你很可能需要。
PS:許多天以後讀我的回答,突然讓我覺得,這將是更好的還是定義在Point
類上面所示的兩種方法來代替,例如:
double DistanceToCenterOf(this Point p, Circle c) { … }
bool LiesWithin (this Point p, Circle c) { … }
...這導致了更易於理解的代碼;例如somePoint.LiesWithin(someCircle)
而不是someCircle.LiesWithinCircle(somePoint)
。
這功課嗎? – Aidan
我不明白你爲什麼使Circle *派生自*點在這裏......它意味着有一種方法*接受*類型Point的值,據我所見.... –
這不是,我正在度假。我正在努力學習這一點。 –