Как интерфейс влияет на класс, который его реализует?Разве он не служит только для определения методов, которые обязательно иметь?
Интерфейс определяет контракт, которому должен придерживаться реализующий класс.
Он определяет public интерфейс, обязательно.Чтобы этот контракт был полезным для других классов, методы, определенные в интерфейсе , должны быть общедоступными .Закрытые / защищенные методы не являются частью контракта, но являются частью внутренней реализации и логически не являются частью интерфейса.Какие бы частные / защищенные методы класс A
не имел, они не представляют интереса для класса B
, поскольку они все равно не могут быть использованы.
Если класс может изменить видимость метода, объявленного в интерфейсе, не будет соответствовать договору .
Каким другим способом я мог бы заставить свои классы реализовать этот метод?
Обычным шаблоном является наличие черт, которые можно использовать для полного удовлетворения требованийинтерфейс.Очевидно, что методы, предоставляемые этой чертой, также должны быть общедоступными.
Если вы хотите определить внутренние компоненты семейства классов, интерфейсы - это не та языковая функция, которую вы должны искать, нонаследование.Вы можете полностью или частично определить методы в родительских классах и использовать эти методы в дочерних классах.
Обратите внимание, что наследование и интерфейсы - это очень разные животные, подходящие для самых разных целей, и наследование приходит с компромиссамикак расширенная связь, которую не поддерживают интерфейсы.
Но если вы хотите пойти по этому пути, вы можете создать что-то вроде:
abstract class AbstractDatabase {
protected abstract function connectDatabase();
}
class mysqlManager extends AbstractDatabase {
protected function connectDatabase() {
// do your thing
}
}
Объявляя класс abstract
, это не может бытьСоздан непосредственно, но должен быть расширен.И объявив метод как protected abstract
, вы говорите, что наследующие классы ДОЛЖНЫ реализовывать метод, чтобы иметь возможность работать.