Я понимаю, что вы создаете класс, который вы ожидаете переопределить, и вы хотите предоставить реализацию по умолчанию для SetupAsync()
, которая позволяет переопределенной версии быть async
.
async
Ключевое слово не является частью сигнатуры метода, которая должна быть скопирована для переопределения метода.Только возвращаемый тип, параметры и модификатор доступа.
Если в вашем методе нет асинхронного кода, не используйте async
.Если вы хотите, чтобы переопределенная версия была async
, то все, что вам нужно сделать, это заставить ее вернуть Task
.
В вашей реализации по умолчанию (которая работает синхронно), вы просто возвращаете значениев Task
с использованием Task.FromResult
.
Например:
class Test {
protected virtual Task<bool> SetupAsync() {
return Task.FromResult(true);
}
}
class Test2 : Test {
protected override async Task<bool> SetupAsync() {
await Task.Delay(1000);
return false;
}
}
Переопределение метода - это не внутренняя работа метода, акак это подвергается другому коду.Любой код должен иметь возможность вызывать переопределенный метод так же, как это было бы с реализацией по умолчанию, и само ключевое слово async
не имеет к этому никакого отношения.
Ключевое слово async
простопозволяет использовать await
внутри метода .Это правда, что использование ключевого слова async
требует, чтобы метод возвращал Task
, но тот факт, что возвращает Task
, изменяет то, как другой код взаимодействует с ним.