2015-10-01 21 views
3

考虑下面的小设计:当派生类中的方法被调用时,是否有可能获知基类?

public class Parent 
{ 
    public event EventHandler ParentWentOut; 
    public virtual void GoToWork() 
    { 
    ParentWentOut(); 
    } 
} 

public class Mother : Parent 
{ 
    public override void GoToWork() 
    { 
    // Do some stuff here 
    base.GoToWork(); // <- I don't want to write this in any derived class. 
         // I want base class's method to be automatically called. 
    } 
} 

有什么机制使Parent.GoToWork方法隐式和自动被调用每当这个方法在后代(这里Mother类)的重写版本的完成?

如果除C#之外还有其他语言能够这样做,我会非常感激的知道。

+0

@ roryap Opps;)尼斯捕获 – Hans

+0

@ roryap无后顾之忧。我习惯了这些类型的反应 – Hans

+1

出于兴趣,你为什么不打电话base.whatever()? – Jay

回答

6

你可以尝试实现这样

public class Parent 
{ 
    public event EventHandler ParentWentOut; 
    public void GoToWork() 
    { 
    BeforeParentWentOut(); 
    ParentWentOut(); 
    AfterParentWentOut();   
    } 

    protected virtual void BeforeParentWentOut() 
    { 
     // Dont do anything, you can even make it abstract if it suits you 
    } 

    protected virtual void AfterParentWentOut() 
    { 
     // Dont do anything, you can even make it abstract if it suits you 
    } 
} 



public class Mother : Parent 
{ 
    protected override void BeforeParentWentOut() 
    { 
     // Do some stuff here 
    } 
} 

东西,你也可以订阅自己的事件对母亲类反应了这一点。

编辑:更新保护,增加前/后的方法来处理时的代码添加到父实施

+0

它是一种可怕的/不好的做法。使代码难以阅读并降低维护性(一种硬代码)。 – SHM

+3

不,这*接近*看起来不错 - 但你应该改为'SpecificMethodForChild'来保护它,所以它不能从外部调用。在这一点上,这基本上是[模板方法模式](https://en.wikipedia.org/wiki/Template_method_pattern),这是绝对好的国际海事组织。当然,你还是要仔细记录下来...... –

+0

通常,可覆盖的方法是'protected',而不是'public',因此很明显它不能让外部用户直接调用。 –

0

因此,访问基类的唯一方法是通过base关键字,它通过调用其构造函数来初始化基类。

因此你的答案是否定的。

+0

任何能够这样做的语言? – Hans

+0

我还没有看到任何语言来支持你想要的东西。 – SHM

+1

你明白了我的观点。我不知道为什么有些人投票! – Hans

1

我建议有两个方法 - 一个用于公共API,一个是方法的内部运作。

public class Parent 
{ 
    public event EventHandler ParentWentOut; 
    public void GoToWork() 
    { 
    GoToWorkOverride(); 
    ParentWentOut(); 
    } 

    protected virtual void GoToWorkOverride() 
    {} 
} 

public class Mother : Parent 
{ 
    protected override void GoToWorkOverride() 
    { 
     // Do some stuff here 
    } 
} 
+1

重复的答案。 – nawfal

+0

这与胡安从11分钟前的回答相同 – MickyD

+0

根据@Jon Skeet的建议编辑了他的正确性。我从一开始就是正确的调用受保护的虚拟方法(模板方法模式)的公共基方法。 – toadflakz

相关问题