Как проектировать классы с наследованием в Java?

Я изучаю Java, но вопрос скорее общий.

Наследник перенимает все методы и поля (все аспекты поведения и состояния) родителя, в том числе приватные. Но получается, что приватные поля и методы мы напрямую использовать в наследнике не можем, что не позволяет проектировать сущность наследника, опираясь на внутреннею реализацию родителя.

Например, создаем класс-родитель "Смартфон без NFC" и класс потомок "Смартфон с NFC". Допустим в классе "Смартфон без NFC" есть поле "вес". Целесообразно сделать его приватным, и добавить геттер. Это нормально, что в таком случае в классе-потомке я смогу использовать это поле только посредством геттера? Получается, что объект-наследник не имеет прямого доступа к одному из основных своих свойств. Или все же здесь ошибка проектирования?

Или например я бы хотел определить метод "использовать NFC" в классе потомке. И для этого хотел бы использовать приватный метод "запуск системы" класса-родителя. Но делать этого я, очевидно, не могу. Писать его заново в потомке - неправильно, но и неправильно сделать его не-приватным в классе-родителе. Так как правильно поступить?


Ответы (2 шт):

Автор решения: Brongs Gaming
  1. Объявите поле как protected.
  2. Метод "Запуск системы" объявите как protected.
→ Ссылка
Автор решения: Алексей Осецкий

Правильнее будет использовать интерфейс. Интерфейс - набор обещаний или можно назвать структурой класса.

Например: Интерфейс смартфона

public interface Smartphone {
    public int weight();
}

И интерфейс модуля NFC, так как в смартфоне не всегда есть NFC, то лучше не обещать в интерфейсе смартфона данный метод.

public interface NfcModule {
    public boolean use();
} 

И реализацию этого интерфейса с помощью implements создать классы.

public class SmartfoneMotorolla implements Smartphone, NfcModule {
    @Override
    public int weight() {
        //200 грам вес смартфона
        return 200;
    }

    @Override
    public boolean use() {
        return true;
    }
}

Более подробно правила ООП с использованием интерфейса можно найти в концепции SOLID

→ Ссылка