Я предполагаю, что ваш точный сценарий немного запутан, и вы, вероятно, думаете в какой-то иерархии классов, где вам нужно обеспечить или обеспечить, чтобы определенный метод вызывался всегда при определенных обстоятельствах. В противном случае решение полностью тривиально, так как 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
и 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
не будет иметь никакого выбора, кроме как вести себя, если код следующий:
Animal = new SomewhatEvilDog();
dog.Eat(); //will call Sleep()
dog.Sleep(); //will call Sleep()
Ну, методы, которые должны сигнализировать его можно просто вызвать этот метод. Или они могут поднять событие, и абонент этого события может вызвать этот метод. На самом деле не совсем понятно, что вы на самом деле пытаетесь сделать здесь, но я подозреваю, что вы где-то ошиблись. – David
Да, внутри каждого метода в 'Animal', добавьте строку' this.Sleep(); ':) – DavidG
Почему бы просто не вызвать Sleep() в конце Play() и Eat()? Будь проще. –