[英]When do I really need to use Abstract Methods?
如果我正在編寫一個繪制形狀的程序。
abstract class GraphicObject {
abstract void draw();
abstract void resize();
}
然后是擴展GraphicObject的子類,稱為Circle。
class Circle : GraphicObject {
void draw() {
...
}
void resize() {
...
}
}
像這樣處理它是否有意義? 當然,一些繪圖代碼會重復嗎?
所以:
abstract class GraphicObject {
public virtual void draw()
{
// all objects will need to be drawn in a similar way, do this here.
}
}
然后在我的圈子課程中,為圈子做所有獨特的事情
public override void draw() {
//Do unique circle drawing stuff here
base.draw();
}
然后在方法末尾調用基本draw方法以完成操作。
我很難看到需要真正使用抽象方法而無需以某種形式重復代碼的情況。
考慮虛擬方法返回值的情況。 考慮一種用於創建值的工廠樣式方法
class Factory {
public abstract Node CreateNode();
}
抽象方法在這里效果很好,因為它對Factory
實際產生Node
值不承擔任何責任。 相反,它只是聲明應提供一個Node
。 如果改為將其設置為虛擬方法,則Factory
必須選擇默認值。 如果不知道工廠是什么類型,如何生產Node
?
public virtual Node CreateNode() {
return ???;
}
除非在繪圖調用的開始或結束時必須對所有形狀進行處理,否則您不會將代碼放在抽象類中進行處理。
如果在繪制過程中有不同的事情要做,可以將它們放在抽象類中,例如,受保護的方法中。 只有繼承的類才可以調用它們,並將這些通用代碼放在一個地方。
抽象方法的使用是為了確保(1)使用形狀的類可以訪問這些方法,而無需知道它持有對哪個子類的引用。 因此,例如,一個頁面可能具有一系列形狀,並在每個形狀上調用draw(因為它是在超類中定義的),即使每個形狀都是特定的子類形狀。 如果未在shape中定義draw(),則無法在列表中的每個形狀上調用draw。
(我更熟悉Java並使用過Java術語-鑒於您的繼承格式和使用“ base”,我認為您對其他內容更加熟悉。根據需要進行翻譯...)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.