В C# вы все еще определяете методы, но вы не предоставляете тело, и вы отмечаете его как абстрактный. Как так:
interface IFoo
{
void Bar();
}
abstract class Foo : IFoo
{
public abstract void Bar();
}
Или иначе говоря: вы не должны «реализовать» это (что было бы ужасным ограничением на абстрактных классов); однако в C# вы должны сообщить компилятору, что вы намеренно передаете доллар в конкретные подклассы - и приведенная выше строка кода показывает, как это сделать.
[Комментарии и жалобы, жалующиеся на то, что это не ответ на вопрос, не имеют смысла. Кто-то, приходящий к stackoverflow, получивший эту ошибку компилятора, но имеющий абстрактный класс, в котором было бы ошибкой поставлять реализацию, застрял без хорошего решения, - должен был бы написать методы реализации, которые бросали исключения во время выполнения, вокруг - пока они не будут иметь вышеуказанную информацию. Хорошо или плохо, что C# требует, чтобы это объяснение выходит за рамки stackoverflow, и не имеет отношения к вопросу, и этот ответ.]
Ха-ха. Я написал одно, а потом решил изменить его. Сожалею. :) – Joel
Основываясь на понижающих прогнозах и комментариях к принятому ответу, я считаю, что downvotes приходят из-за того, как формулируется вопрос. OP спрашивает «почему это так», который будет находиться вне области stackoverflow. Встретившись с этим сам, вопрос больше напоминает «Я что-то упустил? Неужели мне действительно нужно поставлять реализации? Разве это не значит, что это абстрактный класс?» На что ответ «Нет, вам не нужно поставлять * реализации * (что нарушает цель абстрактного класса), но вот что вам нужно сделать, чтобы ваша ситуация работала». – ToolmakerSteve