«Хороший дизайн языка обычно приводит несколько хорошо определенных простых примитивов, которые могут быть объединены вместе в интуитивных и умных способов В отличие от этого, бедный язык дизайн, как правило, приводит. многие раздутые конструкции, которые не играют хорошо вместе.
«абстрактное» и «Override» ключевые слова в C# являются отличным примером этого. Они оба имеют простые определения, но их можно комбинировать, чтобы выразить более сложную концепцию .
Допустим, у вас есть иерархия классов: C производный от B и B вытекает из А. имеет абстрактный метод Foo() и Goo(). Вот два сценария, в которых возникло бы «абстрактное переопределение» . 1) Предположим, что B только хочет реализовать Goo(), и пусть C реализует Foo(). B может помечать Foo() как "абстрактное переопределение". Это ясно говорит о том, что B распознает, что Foo() объявлен в базовом классе , но он ожидает, что другой класс будет реализован.
2) Предположим, что B хочет заставить C до повторно использовать Foo() вместо определения A определения Foo(). В отмечает Foo() в качестве и коррекции (что означает Б распознает Foo() объявляется в базовом классе) и абстрактные (что означает B силы производного класса С, чтобы обеспечить осуществления; независимо, что А уже обеспечили реализация). Это появилось в одном из моих недавних записей в блоге . В этом примере A = TextReader, Foo = ReadLine, B = a helper class, C = некоторый класс, который хочет, чтобы реализовал ReadLine() вместо Read(). Теперь у TextReader уже есть реализация по умолчанию для ReadLine() на основе Read(), но мы хотим пойти по пути . Мы хотим реализовать реализацию Read() на основе классов классов ReadLine(). Таким образом, В представляет собой реализацию Read(), который потребляет ReadLine(), а затем отмечает ReadLine() как «абстрактное переопределения», чтобы заставить C, чтобы переопределять ReadLine() вместо того, чтобы выбрать вверх по одному из TextReader.
В итоге, «абстрактное переопределение» является не круто, потому что это еще более одна особенности языка для выражения сложных углового случая; это классно, потому что это еще не одна особенность языка. Элегантная часть состоит в том, что вам не нужно подумать об этом. Вы просто использовать отдельные основные понятия естественно, и сложный материал поставляется вместе автоматически «
Это мой пример кода для сценария 1:.
В вашем вопросе код не так полезен, но это не значит, что абстрактные и переопределенные комбинированные i s не полезно.
Я не уверен, что понимаю ... в чем преимущество добавления еще одной точки компиляционного отказа? Кроме того, если ваш базовый класс добавляет еще один абстрактный метод и вы не реорганизуете свои производные, вы не получите этот результат последовательно. – LBushkin
@LBushkin: Правда, вы не заметите добавления ...но добавление другой точки сбоя может оказаться полезным, если в противном случае у вас не было бы * any * (имея в виду, что у вас может не быть конкретного класса в любом месте вашей кодовой базы). Я не говорю, что это часто возникает ... –
Любое описание в дереве наследования (decriptive code, или * значимые * комментарии). Наследование делает взаимодействие базового и производного классов немного загадочным - особенно если (а) базовый класс - это нечто иное, чем простой, хорошо спроектированный и сфокусированный объект (б), если сопровождающий не писал как базу, так и производный класс. Наследие замечательно, но может сильно злоупотреблять, чтобы сделать магически закопченный код – STW