【问题标题】:Calling a method when another method is called在调用另一个方法时调用一个方法
【发布时间】:2015-02-11 09:29:17
【问题描述】:

这可能是一个愚蠢的问题,但这里是。

我有以下问题:

public class MyBaseClass
{
    public void SomethingAwesome()
    {
        //Awesome stuff happens here, but only when the Something() method
        //is called in the other classes.
    }
}

public class SomeClass : MyBaseClass
{
    public void Something()
    {
        //Something happens here
    }
}

public class SomeOtherClass : MyBaseClass
{
    public void Something()
    {
        //Something else happens here
    }
}

MyBaseClass 有一个方法需要在继承自它的类中调用 Something() 方法时调用。

这背后的想法是,当出于许多无聊的公司原因调用此方法时,我需要记录。我宁愿有一个基类在调用方法时自动审核,而不是让开发人员自己调用方法。

这样的事情可以实现吗?如果有,怎么做?

我考虑过部分方法,但这需要具有相同名称的类,这在这种情况下是不可能的。

【问题讨论】:

    标签: c# class methods partial-methods


    【解决方案1】:

    听起来你想要template method pattern

    public abstract class MyBaseClass
    {
        public void Something()
        {
            // Code from SomethingAwesome here, or keep SomethingAwesome
            // separate and call it from here
            SomethingImpl();
        }
    
        protected abstract void SomethingImpl();
    }
    
    public class SomeClass : MyBaseClass
    {
        protected override SomethingImpl()
        {
            // Something happens here
        }
    }
    

    这是假设你很高兴 MyBaseClass 能够拥有一个公共的 Something 方法,当然 - 如果它没有声明 Something(以某种方式)那么两个 @ 987654326@派生类中的方法不相关。

    【讨论】:

    • 这有点像我所追求的,但是抽象的 SomethingImpl() 需要有一个实现。我所追求的是SomethingImpl()在SomeClass中被调用,并在基类中被调用。
    • @helb:那发生-因为调用子类代码的唯一方法是通过基类方法。
    • @MikeEason:如果它是抽象的,则不需要实现。我并没有真正关注您的评论,但这确实您想要的,我敢肯定。如果您不希望 MyBaseClass 是抽象的,您可以将 SomethingImpl 设置为一个空的虚拟方法。
    • 我认为有一个小错字:“SomethingAwful”应该说“SomethingAwesome”?
    • 是的,你完全正确。非常感谢先生。
    【解决方案2】:
    public class MyBaseClass
    {
        public void SomethingAwesome()
        {
             // ...
        }
    
        public void Something()
        {
             SomethingImpl();
             SomethingAwesome();
        }
    
        protected abstract void SomethingImpl();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      相关资源
      最近更新 更多