2016-06-23 3 views
0

На вопрос, скажем:Есть ли способ узнать, когда закончен вызов метода?

public class Animal 
{ 
    public Animal Play() {} 

    public Animal Eat() {} 

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

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

Есть ли способ для метода Sleep() будет вызываться каждый раз, когда метод в классе животных был вызван? Это своего рода атрибут TestCleanUp в модульном тесте, но это только для нормального метода.

+1

Ну, методы, которые должны сигнализировать его можно просто вызвать этот метод. Или они могут поднять событие, и абонент этого события может вызвать этот метод. На самом деле не совсем понятно, что вы на самом деле пытаетесь сделать здесь, но я подозреваю, что вы где-то ошиблись. – David

+1

Да, внутри каждого метода в 'Animal', добавьте строку' this.Sleep(); ':) – DavidG

+0

Почему бы просто не вызвать Sleep() в конце Play() и Eat()? Будь проще. –

ответ

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(); 
} 
0

Есть ли способ для метода Sleep(), который будет вызываться каждый раз, когда метод в классе животных был вызван?

Да, вызывать этот метод во всех членах и сделать Sleep() в private методе, а так как, вероятно, не будет каким-либо вне его потребителя.

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

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

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

Я не вижу, как это может стать намного проще, чем это ... –

0

Нет, класс просто класс, вам нужно вызвать метод Sleep() класса Animal

Но вы должны сделать животных класса интерфейс и создать класс под названием Dog, наследующий из интерфейса животных для лучшей читаемости, а затем создать экземпляр этого:

var dog = new Dog(); 

, а затем вызвать метод dog.Sleep()

Чтобы всегда иметь Sleep() метод, который вы вызываете, вам нужно вызвать метод, например, если вы хотите, чтобы его вызывали каждый раз, когда собака съела, наберите вызов метода сна в конце метода Eat():

public void Eat() 
    { 
    //Your eat code 
    Sleep(); 
    } 
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 и 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() 
Смежные вопросы