有什么方法可以知道调用方法何时完成?

时间:2016-06-23 12:04:21

标签: c#

对于这个问题,让我们说:

public class Animal
{
  public Animal Play() {}

  public Animal Eat() {}

  public void Sleep() {/*Do something*/}
}

class Main
{
  var dog = new Animal();
  dog.Play().Eat();
}

每次调用Animal类中的方法时,是否有任何方法可以调用Sleep()方法? 它是单元测试中的一种TestCleanUp属性,但这仅适用于普通方法。

4 个答案:

答案 0 :(得分:1)

public class Animal
{
  public Animal Play() 
  {
    //Do somthing...
    Sleep();
  }

  public Animal Eat() 
  {
    //Do somthing...
    Sleep();
  }

  public void Sleep() {/*Do something*/}
}

class Main
{
  var dog = new Animal();
  dog.Play().Eat();
}

答案 1 :(得分:0)

  

是否有任何方法可以在每次调用Sleep()方法时调用   Animal类中的方法被调用了吗?

是的,在所有成员中调用该方法,并使Sleep()成为private方法,因为可能不会成为其中任何外部消费者。

  public Animal Play() { this.Sleep();}

  public Animal Eat() { this.Sleep();}

  private void Sleep() {/*Do something*/}

答案 2 :(得分:0)

不,该类只是一个类,您需要调用Animal类的Sleep()方法

但是你应该让Animal Class成为一个接口并创建一个名为Dog的类,它继承自Animal Interface以获得更好的可读性,然后创建一个它的实例:

var dog = new Dog();

然后调用dog.Sleep()方法

要始终调用Sleep()方法,您需要调用该方法,例如,如果您希望每次狗吃完时调用它,请将睡眠方法的调用放在最后。吃()方法:

  public void Eat() 
  {
   //Your eat code
   Sleep();
  }

答案 3 :(得分:0)

我猜你的确切情况有点复杂,你可能在某个类层次结构中思考,你需要确保或强制在某些情况下始终调用某个方法。否则,解决方案是完全无关紧要的,因为Rahul's回答了desmonstrates。

您可以使用以下漂亮模式强制始终调用Sleep

public abstract class Animal
{
     public void Sleep() { .... }

     public Animal Eat()
     {
         OnEat();
         Sleep();
     }

     public Animal Play();
     {
         OnPlay();
         Sleep();
     }

     protected abstract Animal OnEat();
     protected abstract Animal OnPlay();
}

现在,任何来自Animal 的“精彩且行为”类必须实施OnEatOnPlay以及{{1}保证在调用SleepEat时调用。如果实现可以从一个派生类到另一个派生类不同,您甚至可以使Play为虚拟。

当然没有什么可以防止派生类变得讨厌:

Sleep

现在以下内容不会致电public class SomewhatEvilDog: Animal { protected override Animal OnEat() { ... } protected override Animal OnPlay() { ... } public new Animal Eat() { OnEat(); } public new Animal Play() { OnPlay(); } } ,我们的世界将会失败并注定失败:

Sleep()

但并非所有坏消息;如果代码如下,SomewhatEvilDog dog = new SomewhatEvilDog(); dog.Eat(); //will NOT call Sleep() dog.Sleep(); //will NOT call Sleep() 将别无选择,只能表现出来:

SomewhatEvilDog