Почему мы не можем создать private class Engine? Не догоняю логики в этом всем, кто может поясните пожалуйста)
Dmitry Olegovich
15 уровень
Class
Решен
Комментарии (9)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Dmitry Olegovich
23 апреля 2022, 11:18
Да и пример у него похожий с этой задачей..
0
Михаил
23 апреля 2022, 10:58
Прикрепляй задачу к вопросу.
Сходу мысль: private - скрытый, чтобы до него добраться, надо знать особые возможности. То есть если он внутренний для класса вызывающего.
0
Dmitry Olegovich
23 апреля 2022, 11:02
Но если этот private class Engine внутри класса car разве класс car не видит что внутри него есть?
0
Михаил
23 апреля 2022, 11:05
поэтому и прошу прикрепить саму задачу. Я например её не помню. Контекста задачи не видно, плюс не видно на что ругается валидатор.
0
Dmitry Olegovich
23 апреля 2022, 11:11
public class Car {
private Engine engine;
//вот здесь я хотел поставить private class
class Engine{
private boolean isRunning;
public void start() {
isRunning = true;
}
public void stop() {
isRunning = false;
}
}
}
А так это верное решение, но я не понимаю почему не пропустило решение с private? Так реально нельзя было или это компилятор шалит? И поясните пожалуйста почему? Потому что смотрю парня на ютубе он обьясняет что в большинстве случаев такие вложеные классы private..
0
Михаил
23 апреля 2022, 11:31
К private ты можешь только изнутри обратится. То есть собрать машину может только сама машина, а не внешний класс. Отсюда в конструкторе class Car можно вставить создание class Engine.
Чаще всего это можно увидеть как:
public class Car {
private Engine engine;
public Car(){
engine = new Engien();
}
private class Engine{
private boolean isRunning = false;
public void start() {
isRunning = true;
}
public void stop() {
isRunning = false;
}
}
}
Но теперь для обращения к этому элементу тебе нужны методы чтобы дергать внутренности Двигателя. То что у методов старт и стоп "паблик" ничего не значит. Ты до них добраться не можешь.
+1
Dmitry Olegovich
23 апреля 2022, 12:50
Т.е. Ниже в методах запуска машины мне нужно будет прописать
public void carStart();{
Engine engine = new Engine();
engine.start();
}
public void carStop();{
Engine engine = new Engine();
engine.stop();
}
Как вы говорите "дернуть"эти методы из private, т.е. когда я ставлю private я как бэ ограничиваю программу, для того что бы когда мне нужно это выполнить, я "дернул" эти методы и выполнил именно тогда когда мне нужно, а не сразу? Поправьте меня если я что то не понимаю,пожалуйста, пытаюсь разобраться))
0
Михаил
23 апреля 2022, 13:12решение
Без создания новых двигателей. Он у тебя будет создан вместе с машиной.
public class Car {
private Engine engine;
public Car(){
engine = new Engine();
}
public void carStart();{
engine.start();
}
public void carStop();{
engine.stop();
}
ООП, Инкапсуляция. Мы кучу приватов делаем чтобы снаружи никто не мог повлиять на реализацию программы. И не подвязывался к поведению.
Для примера. У тебя есть шлагбаум для въезда на территорию завода.
Способ заезда: Остановится перед шлагбаумом. Показать пропуск. Дождаться подъема шлагбаума и проехать.
Реализация: а.Пропуск может быть с радиометкой. б.Может стоять сторож и в бинокль смотреть что показывают. в.Может стоять камера сличающая номера.
а.Шлагбаум может быть на пневматике. б.Его может подымать за веревочку сторож в. Электрическая система подъема.
Таким образом реализаций можно придумать невероятное количество и если что замена одного способа на другой, для пользователя никак не скажется.
В данном случае Двигатель может быть разным. На газу, на бензине, на саляре, электрический, но во всех случаях пользовать заводит его через ключ.
+7
Dmitry Olegovich
23 апреля 2022, 13:20
Спасибо огромное за потраченое на меня время, более менее понятно)
+1