对于这个问题,让我们说:
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属性,但这仅适用于普通方法。
答案 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
的“精彩且行为”类必须实施OnEat
和OnPlay
以及{{1}保证在调用Sleep
或Eat
时调用。如果实现可以从一个派生类到另一个派生类不同,您甚至可以使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