Перегрузка C # - PullRequest
       30

Перегрузка C #

0 голосов
/ 21 марта 2019

Хорошо, я уже решил это, но я хочу спросить / поделиться тем, что вы, ребята, думаете.

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

public class Entity{
    public virtual bool Save() {
          //ReallySave()...
    }

    public virtual int Save(string someParam){
       //also ReallySave()...
    }
}

и у меня есть производный класс, в котором я хотел бы переопределить любой метод save (), который мне хотелось бы переопределить, например

class Person {
     override int Save(string someParam){
           console.log(someParam)
           base.Save(someParam);
     }
}

Теперь проблема в том, что где-то еще я хочу вызвать

person.Save();

или

 person.Save("hello");

, но у меня нет способа узнать (и я не должен), какая перегрузка отменяется.Этот код падает из-за комбинации перезаписываемых перегруженных методов, поскольку вызов save () не переходит в переопределенный метод.

Поэтому я сделал несколько хитростей, чтобы на базовом уровне каждый базовый метод вызывалдругой, что-то вроде шаблона «цепочки ответственности».

Примером модифицированного базового класса будет

public class Entity{

    private bool WithParamsMethodCalled = false;
    private bool NoParamsMethodCalled = false;
    public virtual bool Save() {
          NoParamsMethodCalled  = true;
          if(!WithParamsMethodCalled ) { Save(""); }
          //ReallySave()...
    }

    public virtual int Save(string someParam){
           WithParamsMethodCalled = true;
          if(!NoParamsMethodCalled ) { Save(); }
          ///no need to call ReallySave() here
    }
}

Теперь вопрос: есть ли лучший способ сделать это?Код работает, но

a.его вонючий и

б.Если я хочу больше чем 2 перегрузки, это становится более уродливым

спасибо!

1 Ответ

0 голосов
/ 02 апреля 2019

Поскольку у меня есть много переопределяемых методов с одним и тем же именем, я создал небольшой шаблон для отслеживания того, какое переопределение использовалось (в base.MyMethod (). Затем пользователь может вызвать любую из перегрузок, и приложение выполнитциклически перебирайте все перегрузки, пока не увидите, что есть тот, кто установил свой флаг «execute» в значение true. Затем выполните «метод реальной базы» и прервите цикл.«

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