我有许多任务可以通过类似(但略有不同)的类来完成,它们都具有共同的一组功能。抽象类或部分?
我的意图是将这个功能提取到一个父类中,因为我不希望这个被自己实现,所以我标记了它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