Унаследовав класс в C ++, пользователь может указать спецификатор доступа, например,
class Base
{
public int mem1;
protected in mem2;
};
class Derived1 : **private** Base
{
// mem1 will be private here.
// mem2 will be private here.
};
class Derived2 : **protected** Base
{
// mem1 will be protected here.
// mem2 will be protected here.
};
class Derived2 : **public** Base
{
// mem1 will be public here.
// mem2 will be protected here.
};
Но то же самое невозможно в Java, т. Е. Extends в java всегда похож на «публичное» наследование в C ++.
Может ли кто-нибудь объяснить причину этого?
java
object-oriented
inheritance
Румит Парахия
источник
источник
Ответы:
Большинство преимуществ, которые дает вам частное / защищенное наследование, может быть легко достигнуто с помощью инкапсуляции. Томас Эдинг привел несколько хороших примеров случаев, которые можно упростить с добавлением частного / защищенного наследования, и, хотя это допустимые случаи, существуют обходные пути, которые не требуют частного / защищенного наследования и являются более «идиоматическими» (в Java наименее).
Разработчики языка Java, очевидно, считали, что затраты на сложность, необходимые для поддержки частного / защищенного наследования (включая множественное наследование), перевешивают выгоду, которую он обеспечит.
источник
B
какA
(B
приватно наследуемыйA
), чтобы вы могли полиморфно использовать его в каком-либо методе. С композицией это может быть сделано, но это намного грязнее. Здесь вам необходимо создать отдельный подклассA'
(возможно, внутренний класс), который реализует используемые вами функции. Вам также необходимо вручную делегировать изменения родительскомуB
классу (B
создаетA'
друга,A'
принимает ссылку на негоB
). Я полагаю, это не так сложно сделать, но в коде есть проблемы. (Продолжение)B
получить доступ к защищенным переменным вA
, частное наследование снова проще реализовать поверх композиции. С помощью композиции вы можете реализоватьA'
аналогично описанному выше и / или повысить доступ к защищенным переменным. (3) Предположим, вам нужна единая статическая переменная-член, которая является одной и той же точной переменной в экземплярах шаблона. Решение заключается в частном наследовании от не шаблонного базового класса, который имеет статический член. Композиция не может решить эту проблему, хотя другие методы могут (например, подружить некоторый другой класс с участником).Поскольку Java не имеет множественного наследования и все должно быть (публично) унаследовано
Object
, в Java нет мест, где частное или защищенное наследование могло бы привести к созданию правильной программы.источник