Тебе действительно повезло, что тебе трудно это делать!
Функциональность в большинстве случаев не предназначена для повторного использования через наследование, и это является одной из веских причин для этого: ваш базовый класс реализует некоторый интерфейс, который вы хотите макетировать для клиента (т.е. Y ). Возможно, позже эта функциональность может быть реализована другим классом, и Y должен быть в состоянии использовать эту новую, возможно лучшую, реализацию.
Y имеет / использует X, но Y не является X.
Если вашему классу Y необходимо использовать функциональность X (подключиться к серверу и т. Д.), Он должен агрегировать его, а не наследовать от него.
Вы заметите, что схема агрегации позволяет так же насмехаться.