Почему публичное наследование поощряется, когда сокращение публично видимого API кажется предпочтительным с точки зрения удобства сопровождения?
Я использую bada и ссылаюсь на учебник, который начинается:
class MainForm:
public Osp::Ui::Controls::Form,
public Osp::Ui::IActionEventListener,
public Osp::Ui::ITouchEventListener
{
Я выполняю код, в котором я недавно удалил публичный спецификатор, чтобы сократить мой публичный API. Вы увидите, что функции, реализующие те интерфейсы, где все также объявлены публично, для которых я не видел необходимости и сделали приватными. Я сделал бы это без колебаний при реализации своих собственных интерфейсов, когда эти интерфейсы могут предоставлять больший доступ, чем я хотел бы получить обычным клиентам моего конкретного класса.
В чем причина их публикации, чего мне не хватает?
Я предполагаю, что он призван содействовать расширению, но для разработчика, создающего приложения, а не библиотеки, я бы оспорил эту мудрость.
2 ответа
Если Form
, IActionEventListener
а также ITouchEventListener
уже поддерживают много полезных методов, в большинстве случаев зачем их скрывать? Напротив: если вы их скрываете и в будущем кому-то они понадобятся, вам будет труднее поддерживать класс, потому что вам нужно будет предоставить их снова.
Если вам нужно скрыть родительские методы, есть другой способ сделать это: вместо наследования заключите "родительский" в качестве поля в новый класс.
В некоторых языках, таких как C#, публичное наследование является единственным вариантом.
Для меня частное наследование "интерфейсов" не имеет смысла.
Интерфейс объекта - это его набор открытых методов. Как сказал Илья, если вы хотите использовать функции, предоставляемые классом внутри, используйте композицию объектов. Если вы хотите предоставить подмножество интерфейса, то либо создайте, либо просто объявите более ограничительный интерфейс.
Если "интерфейс" и функции, принимающие объект из этого интерфейса, находятся в сторонней библиотеке, то это означает, что разработчики хотели заставить вас реализовать все методы, поэтому вы должны предоставить их.