Это отличный вопрос, с которым я столкнулся в своих проектах.
Некоторые считают, что интерфейсы и абстрактные классы существуют только для полиморфизма, а не для принуждения типов к реализации определенных методов. Лично я считаю полиморфизм первичным вариантом использования, а принудительную реализацию - вторичным. Я использую технику принудительной реализации довольно часто. Как правило, это появляется в коде платформы, реализующем шаблон шаблона. Базовый / шаблонный класс заключает в себе некоторую сложную идею, а подклассы предоставляют многочисленные варианты, реализуя абстрактные методы. Одним из прагматических преимуществ является то, что абстрактные методы обеспечивают руководство для других разработчиков, реализующих подклассы. Visual Studio даже может отключить методы для вас. Это особенно полезно, когда разработчику технического обслуживания необходимо добавить новый подкласс спустя месяцы или годы.
Недостатком является то, что в C # нет конкретной поддержки для некоторых из этих шаблонных сценариев. Статические методы - это одно. Еще один конструктор; в идеале ISerializable должен заставить разработчика реализовать конструктор защищенной сериализации.
Возможно, самый простой подход (как предлагалось ранее) - использовать автоматический тест для проверки того, что статический метод реализован на желаемых типах. Еще одна жизнеспособная идея, уже упомянутая, заключается в реализации правила статического анализа.
Третий вариант - использовать платформу аспектно-ориентированного программирования, такую как PostSharp . PostSharp поддерживает проверку аспектов во время компиляции. Вы можете написать .NET-код, который отражает сборку во время компиляции, генерируя произвольные предупреждения и ошибки. Обычно вы делаете это, чтобы проверить, подходит ли использование аспекта, но я не понимаю, почему вы не можете использовать его и для проверки правил шаблона.