Вызовите родительский метод до (или после) любого дочернего метода - PullRequest
0 голосов
/ 19 февраля 2019

Скорее всего, я получу отрицательный ответ здесь, но я бы хотел задать свой вопрос.

Есть ли способ в C # вызвать родительский метод до (или после) ЛЮБОГО метода дочернего класса.

public class Base
{
    protected static void ThisWillBeCalledBeforeAnyMethodInChild()
    {
        //do something, e.g. log
    }

    protected static void ThisWillBeCalledAFTERAnyMethodInChild()
    {
        //do something, e.g. log
    }
}

public class SomeClass : Base
{
    public static void SomeMethod1()
    {
        //Do something
    }

    public static void SomeMethod2()
    {
        //Do something
    }
}

Итак, я хочу, чтобы метод ThisWillBeCalledBeforeAnyMethodInChild из базового класса выполнялся до SomeMethod1 или SomeMethod2 в SomeClass.Аналогично методу after.

Есть ли способ сделать это без вызова методов с отражением?

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Итак, кроме вашего дочернего метода, вызывающего base.MethodNameYouWantToCall (), до или после, вы можете использовать другой подход.

Это просто идея, и она может не соответствовать тому, что вы пытаетесьдостижения, но если мне нужно, чтобы каждый дочерний класс вызывал родительские функции до и после чего-то, я мог бы сделать это:

class Parent 
{ 
   protected void Before() { /* does things */ }
   protected void After() { /* does things */ }
   abstract void OtherCode();

   public void PubliclyExposedMethod {
        Before();
        OtherCode();
        After();'
}
class Child : Parent {
      OtherCode { Console.Write("Hello world"); }
}

В приведенном выше методе, который вы определили в дочернем, будет побежал после метода before и до after.Я думаю, что это чище, потому что это уменьшает количество раз, когда вам нужно написать базу. ()

0 голосов
/ 19 февраля 2019

Одна идея, которая приходит мне в голову, - написать метод-обертку, который получает действие в качестве параметра.Там вы можете вызвать методы до и после:

public class SomeClass : Base
{
    public static void SomeMethod1()
    {
        //Do something
    }

    public static void SomeMethod2()
    {
        //Do something
    }

    public static void WrapperMethod(Action action)
    {
        Base.ThisWillBeCalledBeforeAnyMethodInChild();
        action();
        Base.ThisWillBeCalledAFTERAnyMethodInChild
    }

}

Вы бы назвали это так:

SomeClass.WrapperMethod(()=> SomeClass.SomeMethod1());
0 голосов
/ 19 февраля 2019

Прежде всего, статические методы не участвуют в наследовании.

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

class Program
{
    static void Main(string[] args)
    {
        var s = new SOmeClass();

        s.SomeMethod1();
        s.SomeMethod2();
    }
}

public class Base
{
    protected  void ThisWillBeCalledBeforeAnyMethodInChild()
    {
        Console.WriteLine("ThisBefore");
    }

    protected  void ThisWillBeCalledAFTERAnyMethodInChild()
    {
        Console.WriteLine("ThisAFTER");
    }
}

public class SOmeClass : Base
{
    public  void SomeMethod1()
    {
        base.ThisWillBeCalledBeforeAnyMethodInChild();
        Console.WriteLine("SomeMethod1");
    }

    public  void SomeMethod2()
    {
        Console.WriteLine("SomeMethod2");
        base.ThisWillBeCalledAFTERAnyMethodInChild();
    }
}

Вывод:

ThisFeforeEomeMhohod1 SomeMethod2 ThisAFTER

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...