1) Компиляция не выполняется в OO.Это деталь конкретных реализаций ОО.Если вы хотите получить ответ для конкретной реализации (например, Java), вам нужно уточнить.
В общем, некоторые скажут, что добавление в интерфейс не считается серьезным изменением, тогда как другие говорят, что вы не можете изменитьинтерфейс после его публикации, и вам нужно создать новый интерфейс.
Редактировать : вы указали C #, поэтому проверьте этот вопрос, касающийся критических изменений в .Net .Я не хочу делать это, отвечая на медвежью услугу, поэтому я не буду пытаться повторить это здесь.
2) Люди часто взламывают свои замыслы, чтобы сделать это, но этопризнак того, что у вас плохой дизайн.
Хорошие альтернативы :
Создайте метод в своем интерфейсе, который позволит вам вызывать пользовательское поведение,но не обязательно знать, что это за поведение.
Создать дополнительный интерфейс (и новую фабрику), поддерживающий новые методы.Новый интерфейс не должен наследовать старый интерфейс, но может, если это имеет смысл (если между интерфейсами может быть выражено отношение is-*).
Если ваш язык поддерживаетиспользуйте шаблон Abstract Factory и воспользуйтесь Ковариантными типами возврата на бетонном заводе.Если вам нужен конкретный производный тип, примите конкретный завод вместо абстрактного.
Плохие альтернативы (анти-шаблоны):
Добавление метода к интерфейсу, который ничего не делает в других классах производных.
Создание исключения в методе, который не имеет смысла для вашего производного класса.
Добавление методов запроса в интерфейс, которые сообщают пользователю, могут ли они вызвать определенный метод.
Если имя метода не является достаточно универсальным, чтобыпользователь не будет ожидать, что он что-то сделает (например, DoExtraProcessing
), тогда добавление метода, который не работает в большинстве производных классов, нарушает контракт, определенный этим интерфейсом.
Например: Кто-то вызывает bird.Fly()
ожидал бы, что это на самом деле сделать что-то.Мы знаем, что цыплята не могут летать.Так что либо Chicken
не является Bird
, либо Bird
s не Fly
.
Добавление методов запроса является плохим обходным путем.Например, добавив метод или свойство boolean CanFly()
в ваш интерфейс.Так бросает исключение.Никто из них не обходит стороной тот факт, что тип просто не заменяется.Ознакомьтесь с принципом замены Лискова (LSP).