2015-02-11 3 views
2

Это может быть глупый вопрос, но здесь идет.Вызов метода при вызове другого метода

У меня есть следующая проблема:

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 имеет метод, который должен быть вызван, когда то() вызывается метод в классе, который наследует от него.

Идея заключается в том, что мне нужно регистрироваться, когда этот метод вызывается для множества скучных корпоративных причин. Я предпочел бы иметь базовый класс, который автоматически проверяет, когда вызывается метод, вместо того, чтобы разработчик сам вызывал этот метод.

Может ли быть что-то подобное достигнуто? Если да, то как?

Я рассмотрел частичные методы, но для этого потребуются классы с одинаковым именем, что невозможно в этом сценарии.

ответ

6

Это звучит, как вы хотите 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 (в некотором роде), то два метода Something в производных классах не связаны.

+0

Это то, что мне нужно, однако абстрактное SomethingImpl() должно иметь реализацию. То, что мне нужно, - SomethingImpl() вызывается в SomeClass и вызывается в базовом классе. –

+0

@helb: Это * произойдет *, потому что единственный способ вызвать код подкласса - это метод базового класса. –

+0

@MikeEason: ему не нужно иметь реализацию, если она абстрактна. Я действительно не придерживаюсь вашего комментария, но это действительно * * то, что вы хотите, я уверен. Если вы не хотите, чтобы 'MyBaseClass' был абстрактным, вы могли бы сделать' SomethingImpl' просто пустым виртуальным методом. –

1
public class MyBaseClass 
{ 
    public void SomethingAwesome() 
    { 
     // ... 
    } 

    public void Something() 
    { 
     SomethingImpl(); 
     SomethingAwesome(); 
    } 

    protected abstract void SomethingImpl(); 
} 
Смежные вопросы