2012-02-26 2 views
3

В C++ можно расширить (вывести) базовый класс приватно к классу ребенка:Private простираться в Java

class Base 
{ 
// .... 
}; 

class Child : private Base 
{ 
// .... 
}; 

Что такое соответствующий синтаксис в Java? Если Java не так ли, то что делают Java-программисты?

+7

Мы не касаемся частных деталей. ;-) –

+3

@ SanjayT.Sharma: Я был бы очень обеспокоен, если бы ваши дети имели доступ к частным членам вашего класса;) –

+0

В целом мы стараемся не нарушать основы ООП и инкапсуляции. Если вы хотите, чтобы части ваш класс должен быть расширяемым, сделать их защищенными. Частные поля - это детализация реализации. – Voo

ответ

2

синтаксиса Java для наследования:

class Base {} 
class Child extends Base 
{ 
    // ... 
} 

Там нет частного наследования в Java. Java имеет только публичное наследование. То есть вы оба наследуете реализацию и интерфейс.

С частным наследством вы только наследуете реализацию. Насколько я помню, это, по сути, более статическая форма композиции.

В большинстве случаев вы можете использовать composition, чтобы сделать то же самое.

public class Child{ 
    private Base base; 

    public Child(...){ 
     base = new Base(...); 
    } 
} 
+1

Больше, чем состав, следует учитывать, когда наследование представляет собой деталь реализации. Рассмотрим класс с определенным интерфейсом для своих пользователей, который по какой-либо причине должен каким-то образом расширить интерфейс (который не является частью его контракта). В C++ вы можете реализовать этот интерфейс конфиденциально, без того, чтобы ваши пользователи могли использовать этот факт (например, ваши обычные пользователи не могут вызывать методы, отличные от тех, что указаны в вашем контракте (публичный интерфейс). Наследование должно * никогда не использоваться для композиции. –

+1

Я предполагаю, что в java вы бы использовали внутренний (или анонимный) класс для реализации интерфейса * private *, поскольку внутренний тип будет неявно иметь доступ к вашему типу. –

1

Java не имеет эквивалента.

1

В частном наследования C++ означает, что на самом деле: реализуется в терминах

Т.е. это метод реализации, который используется, когда у вас есть 2 класса, не имеющие отношения , - это отношение, но ему необходим доступ к защищенным членам или необходимо переопределить его виртуальные функции.

Таким образом, этим определением вы можете сделать это на Java, просто расширив класс или используя композицию.

Синтаксис частного просто не доступен, но вы можете получить тот же результат

2

В определенной степени, вы могли бы использовать частный внутренний класс для достижения аналогичного эффекта:

public class Base { 

    private int privateMember = 10; 

    private class Child extends Base { 
     public Child() { 
      System.out.println("I can see your privates: " + privateMember); 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     Base t = new Base(); 
     Child c = t.new Child(); 
    } 

} 

При запуске вышеуказанного кода на консоли печатается следующее сообщение:

I can see your privates: 10 
+0

_ Я вижу ваших рядовых_. лол. : D – ApprenticeHacker

Смежные вопросы