Я очень надеюсь, что мой ответ поможет некоторым людям, смущенным этой проблемой.
Терпите меня, но я постараюсь подвести итог тому, что спрашивают, просто чтобы убедиться, что я отвечаю на правильный вопрос. Тогда я дам ответ!
Я думаю, что суть вопроса такова: как мне объявить метод в абстрактном классе, чтобы он имел реализацию, но все еще требует, чтобы производный класс переопределил метод?
C # не поддерживает это. Если вы объявляете метод «абстрактным», ему не разрешается иметь реализацию (тело). Но если вы объявите его «виртуальным», производный класс не будет вынужден переопределять его. C # не позволяет помечать метод как абстрактный и виртуальный.
Я полагаю, что есть много ситуаций, когда вы хотите сделать это (о чем спрашивают).
Способ решения этой загадки заключается в следующем: Объявите два метода! Один из них помечен как «абстрактный»; другой помечается как «виртуальный» и называет первый где-то в своем теле.
Таким образом, производный класс вынужден переопределять абстрактный метод, но (частичная) реализация в виртуальном методе может быть безопасно унаследована.
Так, например, метод GiveBonus для Employee может быть объявлен так:
public abstract decimal ComputeBonus();
public virtual void GiveBonus() {
decimal amount = ComputeBonus();
if (amount > 0.0) PostBonus(amount);
}
Я оставлю детали PostBonus для воображения, но прелесть этого подхода в том, что производные классы вынуждены переопределять ComputeBonus, однако GiveBonus выигрывает от частичной реализации, предоставляемой в базовом классе. НТН