Я новичок в программировании на Java, пытаясь повесить ООП.
Итак, я построил этот абстрактный класс:
public abstract class Vehicle{....}
и 2 подкласса:
public class Car extends Vehicle{....}
public class Boat extends Vehicle{....}
Car
и Boat
также содержат некоторые уникальные поля и методы, которые не являются общими (не имеют одинакового имени, поэтому я не могу определить абстрактный метод для них в Vehicle).
Теперь в mainClass я установил свой новый гараж:
Vehicle[] myGarage= new Vehicle[10];
myGarage[0]=new Car(2,true);
myGarage[1]=new Boat(4,600);
Я был очень доволен полиморфизмом, пока не попытался получить доступ к одному из полей, которые уникальны для Car, например:
boolean carIsAutomatic = myGarage[0].auto;
Компилятор этого не принимает. Я работал над этой проблемой, используя кастинг:
boolean carIsAutomatic = ((Car)myGarage[0]).auto;
Это работает... но это не помогает с помощью методов, просто полей. Значение Я не могу сделать
(Car)myGarage[0].doSomeCarStuff();
Итак, мой вопрос: что я действительно имею в своем гараже? Я пытаюсь понять интуицию, а также понять, что происходит "за кулисами".
для будущих читателей, краткое изложение ответов ниже:
- Да, там
Car
вmyGarage[]
- Являясь статическим типизированным языком, компилятор Java не будет предоставлять доступ к методам/полям, которые не являются "Транспортными средствами", при доступе к ним через структуру данных на основе суперкласса Vehicle (например,
Vehicle myGarage[]
) - Что касается того, как решить, есть два основных подхода ниже:
- Используйте литье типов типов, которое облегчит проблемы компилятора и оставит любые ошибки в дизайне для запуска.
- Тот факт, что мне нужно кастинг, говорит о том, что дизайн ошибочен. Если мне нужен доступ к возможностям, не связанным с транспортным средством, тогда я не должен хранить автомобили и лодки в структуре данных на базе транспортного средства. Либо сделайте все эти возможности принадлежащими Vehicle, либо используйте более конкретные структуры (основанные на типе).
- Во многих случаях состав и/или интерфейсы были бы лучшей альтернативой наследованию. Возможно, тема моего следующего вопроса...
- Плюс много других хороших идей там, если у вас есть время, чтобы просмотреть ответы.