2012-03-08 65 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