我有許多任務可以通過類似(但略有不同)的類來完成,它們都具有共同的一組功能。抽象類或部分?
我的意圖是將這個功能提取到一個父類中,因爲我不希望這個被自己實現,所以我標記了它abstract
。
但是,所有調用類都調用一個方法 - 用於包含提取的通用功能。我不想override
父類的方法,但我希望它被執行另外到子類中定義的內容。
我最初認爲這是一個部分方法的工作,但我認爲這會在某種程度上破壞語義。那麼對我而言,最好的方式是什麼?在這裏體驗一下隧道視野。
我有許多任務可以通過類似(但略有不同)的類來完成,它們都具有共同的一組功能。抽象類或部分?
我的意圖是將這個功能提取到一個父類中,因爲我不希望這個被自己實現,所以我標記了它abstract
。
但是,所有調用類都調用一個方法 - 用於包含提取的通用功能。我不想override
父類的方法,但我希望它被執行另外到子類中定義的內容。
我最初認爲這是一個部分方法的工作,但我認爲這會在某種程度上破壞語義。那麼對我而言,最好的方式是什麼?在這裏體驗一下隧道視野。
你可以做這樣的:像你需要
public abstract class Parent
{
public void TheSingleMethod()
{
CommonFunctionality();
InternalDo();
}
protected abstract void InternalDo();
private void CommonFunctionality()
{
// Common functionality goes here.
}
}
public class Derived : Parent
{
protected override void InternalDo()
{
// Additional code of child goes here.
}
}
爲什麼不直接在重寫的方法中調用base.InternalDo()? – 2012-03-08 10:16:40
原因是你無法執行它。如果你想*強制執行所有派生類的通用功能,我所展示的方式就是要走的路。如果它是*可選*,那麼你的建議就是要走的路。 – 2012-03-08 10:18:06
啊,我現在明白他的需要了。好點子! – 2012-03-08 10:21:25
聽起來像組成和Decorator pattern可能是你的另一種選擇。
例如
abstract class BaseClass {
public void Common Method() {
// Common tasks
// Call template method
this.SubclassSpecificMethod();
// Can also do more code after the call to the template method
}
protected abstract void SubclassSpecificMethod();
}
你也可以這樣做:
abstract class BaseClass
{
public void Method() {
// Common tasks
}
}
class RealClass : BaseClass
{
public void Method() {
base.Method();
// custom tasks for this class
}
}
此方法不會強制執行所有子項的通用功能。請參閱[我的答案評論](http://stackoverflow.com/questions/9615909/abstract-classes-or-partial/9615974#comment12201179_9615974)瞭解更多信息。 – 2012-03-08 10:25:30
我知道,但作者沒有要求。我的方法給予更多的靈活性根據作者的需要,其中一條或另一條是要走的路。 – Deadeye 2012-03-08 10:52:14
是的,他請求它:「我不想重寫父類方法,但我希望它除了在子類中定義的內容之外被執行」 – 2012-03-08 11:46:58
對不起,你能否澄清這一點「我我不想要父類方法,但我希望它能夠在子類中定義的內容之外執行「。您的功能在兒童課程中定義在哪裏? – Paddy 2012-03-08 10:16:16