Так как часть системы проката автомобилей мне нужно написать классы для представления больших и маленьких автомобилей, разница между ними заключается в том, что они имеют разные емкости и потребляют топливо с разной скоростью. В настоящее время мой подход состоит в том, чтобы иметь интерфейс Car, реализованный абстрактным классом AbstractCar, который расширяется двумя конкретными классами SmallCar и LargeCar. Однако это мой первый раз, когда мы используем интерфейсы и абстрактные классы (мы просто освещаем их в классе, и это назначение предназначено для оценки наших знаний о них), и у меня возникают проблемы с пониманием того, что делать в каком классе.Изучение интерфейсов и иерархий, где размещать определенные переменные и методы?
Реализации метода заполнения точно такие же, им просто нужно обратиться к правильному значению FUEL_CAPACITY, поэтому он чувствует, что должен реализовывать эти методы в классе AbstractCar, но тогда я не знаю, как получить чтобы ссылаться на правильные значения FUEL_CAPACITY. Поле FuelLevel также очевидно удерживается всеми автомобилями, поэтому кажется, что я должен объявить его в AbstractCar, но тогда я не могу получить к нему доступ из подклассов, не удаляя его конфиденциальность.
Может ли кто-нибудь помочь мне выяснить, что я делаю неправильно или непонимаю о интерфейсах и наследовании? Одна вещь, которую я рассматривал, заключается в создании enum CarType, когда AbstractCar содержит CarType в качестве поля, и вся реализация выполняется в классе AbstractCar, используя операторы if для переключения на правильное значение FUEL_CAPACITY и просто используя SmallCar и LargeCar в качестве конструкторов или фабричные классы без особых или даже реальных реализаций.
Заранее благодарим за любую помощь. Я понимаю, что он немного длинный, но я стараюсь, чтобы я полностью понимал концепции, которые мы изучаем, и что я их правильно реализую, а не просто собираю то, работает ", но может и не обязательно быть правильным или самым изящным решением.
Вы можете передать логику в 'AbstractCar' со значениями. Затем просто установите эти значения в contrustor 'SmallCar' и' LargeCar'. Это был бы один подход. Как вы указали, вы всегда должны иметь общую логику в родительском классе. Вы хотите избежать дублирования кода. Тогда вам просто нужно убедиться, что вы устанавливаете разные значения в конструкторе. И если вы знаете значение fix, вы можете даже опустить параметры «SmallCar» или «LargeCar» и просто установить эти фиксированные значения в вызове 'super()' внутри конструктора. –