Как правило, насколько близко объекты программирования должны отражать реальные объекты.
Не очень, только достаточно.
Одной из основных характеристик ООП, является абстракция. Вам не нужно иметь все атрибуты / методы объекта, чтобы иметь возможность его использовать.
Вам просто нужно базовое, чтобы использовать его.
Все, что связано с объектами, состоит в том, чтобы данные и функции выполняли что-то с этими данными в одном месте.
Так что в вашем фруктовом классе мне лучше иметь что-то вроде Color
или указание, если это будет съедено. Например:
Fruit
+ color : Color
- isMature : Boolean
+ canBeEaten() : Boolean
return isMature
Таким образом, вы можете создавать разные фрукты
apple = Fruit()
appe.color = Color.red
out.print( "Can this fruit be eaten? %s ", apple.canBeEaten() )
orange = Fruit()
orage.color = Color.orange
out.print( "Can this fruit be eaten? %s ", orange.canBeEaten() )
1022 * Etc. *
Если вы видите, что атрибуты (color и isMature) хранятся внутри объекта. Таким образом, вам не нужно следить за их состоянием извне.
Что касается наследования, то оно имеет смысл только тогда, когда вам нужно добавить новое поведение в какой-либо метод, и да, методы относятся к атрибутам или характеристикам объекта. Как вы отмечаете, fruit.eat()
не имеет особого смысла.
Но рассмотрим способ получения сока из фрукта.
Fruit
+ getJuice(): Juice
Apple -> Fruit
+ getJuice(): Juice
// do what ever is needed internally to create the juice
Orange -> Fruit
+ getJuice(): Juice
// here, certainly the way to get the juice will be different