«Программирование на интерфейсе» означает разработку набора методов и свойств, которые являются общедоступной «сигнатурой» функциональности или услуги, предоставляемой классом.
Вы объявляете его как интерфейс, а затем реализуете его в классе, который реализует интерфейс.
Затем для замены класса может использоваться любой другой класс, реализующий интерфейс.
Интерфейс становится контрактом.
Однако это не для статических методов.
Я не уверен, для какой цели служит User.Authenticate(username, password)
- возвращает ли оно значение, указывающее, что пользователь аутентифицирован? Что такое неаутентифицированный пользовательский объект?
Возможно, у вас есть какой-то центральный контроллер аутентификации, который аутентифицирует пользователей, а затем возвращает другой класс объектов в зависимости от пользователя. Каждый класс будет реализовывать (или, возможно, вместо этого наследовать от пользовательского класса) пользовательский интерфейс для общей функциональности, а затем расширяться за счет своей специфической функциональности.
Я не совсем уверен, что этот пример является хорошим вариантом для наследования или реализации интерфейса, он действительно будет зависеть от дополнительных деталей проекта, которых у нас нет.