2012-03-08 83 views
2

我有許多任務可以通過類似(但略有不同)的類來完成,它們都具有共同的一組功能。抽象類或部分?

我的意圖是將這個功能提取到一個父類中,因爲我不希望這個被自己實現,所以我標記了它abstract

但是,所有調用類都調用一個方法 - 用於包含提取的通用功能。我不想override父類的方法,但我希望它被執行另外到子類中定義的內容。

我最初認爲這是一個部分方法的工作,但我認爲這會在某種程度上破壞語義。那麼對我而言,最好的方式是什麼?在這裏體驗一下隧道視野。

+0

對不起,你能否澄清這一點「我我不想要父類方法,但我希望它能夠在子類中定義的內容之外執行「。您的功能在兒童課程中定義在哪裏? – Paddy 2012-03-08 10:16:16

回答

6

你可以做這樣的:像你需要

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. 
    } 
} 
+0

爲什麼不直接在重寫的方法中調用base.InternalDo()? – 2012-03-08 10:16:40

+0

原因是你無法執行它。如果你想*強制執行所有派生類的通用功能,我所展示的方式就是要走的路。如果它是*可選*,那麼你的建議就是要走的路。 – 2012-03-08 10:18:06

+0

啊,我現在明白他的需要了。好點子! – 2012-03-08 10:21:25

1

聽起來Template method

例如

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(); 
} 
0

你也可以這樣做:

abstract class BaseClass 
{ 
    public void Method() { 
     // Common tasks 
    } 
} 

class RealClass : BaseClass 
{ 
    public void Method() { 
     base.Method(); 
     // custom tasks for this class 
    } 
} 
+0

此方法不會強制執行所有子項的通用功能。請參閱[我的答案評論](http://stackoverflow.com/questions/9615909/abstract-classes-or-partial/9615974#comment12201179_9615974)瞭解更多信息。 – 2012-03-08 10:25:30

+0

我知道,但作者沒有要求。我的方法給予更多的靈活性根據作者的需要,其中一條或另一條是要走的路。 – Deadeye 2012-03-08 10:52:14

+0

是的,他請求它:「我不想重寫父類方法,但我希望它除了在子類中定義的內容之外被執行」 – 2012-03-08 11:46:58