Как проектировать классы с наследованием в Java?
Я изучаю Java, но вопрос скорее общий.
Наследник перенимает все методы и поля (все аспекты поведения и состояния) родителя, в том числе приватные. Но получается, что приватные поля и методы мы напрямую использовать в наследнике не можем, что не позволяет проектировать сущность наследника, опираясь на внутреннею реализацию родителя.
Например, создаем класс-родитель "Смартфон без NFC" и класс потомок "Смартфон с NFC". Допустим в классе "Смартфон без NFC" есть поле "вес". Целесообразно сделать его приватным, и добавить геттер. Это нормально, что в таком случае в классе-потомке я смогу использовать это поле только посредством геттера? Получается, что объект-наследник не имеет прямого доступа к одному из основных своих свойств. Или все же здесь ошибка проектирования?
Или например я бы хотел определить метод "использовать NFC" в классе потомке. И для этого хотел бы использовать приватный метод "запуск системы" класса-родителя. Но делать этого я, очевидно, не могу. Писать его заново в потомке - неправильно, но и неправильно сделать его не-приватным в классе-родителе. Так как правильно поступить?
Ответы (2 шт):
- Объявите поле как protected.
- Метод "Запуск системы" объявите как 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