2013-06-20 6 views
2

В Java мы могли бы иметь (предположим, что дополнительные методы конструктора и т.д.):Подкласс как набор классов

class Car 
{ 
    public void Vrooom() { System.out.print("Vrooom!"); } 
} 

class Prius extends Car 
{ 
    public void Vrooom() { System.out.print("..."); } 
} 

class Cars extends Car 
{ 
    private ArrayList<Car> mCars; 
    public void Vrooom() { for(Car car: mCars) car.Vrooom(); } 
} 

я наткнулся на код делает что-то вроде этого, но Cars не чувствует себя хорошо мне, как он должен переопределить каждый метод Car, чтобы добавить цикл for. Это анти-шаблон, и если да, то почему я не должен этого делать?

+2

Наследование должно представлять отношения is-a. Обычно вы не говорите, что множество автомобилей - это автомобиль. –

+0

Я согласен с @VaughnCato, как правило, вы расширяете свой класс 'Cars' от типа массива (или любого другого эквивалентного класса java) или просто используете общий список на своем месте (если вам не нужен сильно- типизированное представление с помощью вспомогательных методов и т. д.). Кроме того, почему вы не должны этого делать, расширив «Автомобиль», вам ничего не мешает добавить «Автомобили» в ваш список. В конце концов, вы говорите: «Автомобили - это автомобиль». – Joshua

ответ

2

Вы наследуете автомобиль, чтобы представлять список автомобилей? Вам не нужно это делать. Если вы просто хотите получить список автомобилей, то вы можете создать

List<Car> list = new ArrayList<Car>(); 

Наследование означает подкласс должен передать IS-тест для суперкласса и в вашем случае, список автомобилей, не совсем автомобиль.

+0

Спасибо, «IS-A» было выражением, которое я искал - я готовлю слайды, чтобы описать, почему база кода ужасна, поэтому я добавлю это. –

2

Вы правы, что-то об этом не так. На мой взгляд, коллекция object s не должна распространяться на этот номер object.

Это может быть случай, что у вас есть дилерский, который содержит несколько машин, но я думаю, что вы могли бы сделать, что, как (и я не Java, так что я мог бы ввернуть синтаксис немного):

class Dealership extends Businesses 
{ 
    private private ArrayList<Car> sellableCars; 

    public void itsAHugeSalesSpectacular() { 
     for(Car car: sellableCars) car.Vrooom(); 
    } 
} 

Но, по моему опыту, нет причин, по которым вы определяете автомобили дилерства как самостоятельного объекта.

Смежные вопросы