2015-01-26 4 views
1

Я супер новичок в Java, и я пытаюсь выяснить, как динамически установить, следует ли использовать определенный подкласс.Java условные операторы и подклассы

Вот мой сломанный код:

if(length == width){ 
    Square myBox = new Square(); 
}else{ 
    Rectangle myBox = new Rectangle(); 
} 

То, что я пытаюсь сделать, это использовать «квадрат» подкласс, когда длина и ширина (вводится пользователем) равны. Я не знаю, как заставить его делать то, что я хочу, поэтому я использовал «общую логику кодирования» из моего более обширного опыта работы с PHP (очевидно, ничего не поделать, мой самый большой шаг в изучении Java до сих пор переходил с PHP на Java в моей голове, ха-ха)

Так что мне интересно, есть ли способ сделать это. Если нет, тогда все в порядке, я его обману. Я просто подумал, что спрошу.

+1

Осторожно: Если площадь наследует от прямоугольника, то оба класс должен быть неизменен. Повторное вызов setWidthAndHeight (x, y) с x! = Y вызовет проблемы для Square, но не для его базового прямоугольника Rectangle. В большинстве случаев лучше придерживаться Rectangle. –

ответ

5

Я предполагаю, что Square является подклассом Rectangle. В этом случае:

Rectangle myBox; 

if (length == width) { 
    myBox = new Square(); 
} else { 
    myBox = new Rectangle(); 
} 
1

Во-первых, вы объявляете эти переменные внутри ветвей if заявления - сфера их применения ограничивается этими ветвями. Таким образом, переменная myBox будет видна только между этими скобками. Скорее всего, это не то, что вы хотите.

Во-вторых, как уже было отмечено, на @Robby Корнелиссен - если Square подкласс Rectangle, вы хотите использовать Rectangle.

Но, хотя в математике квадрат является частным случаем прямоугольника, это классический пример объектно-ориентированной логики, немного отличающийся. Прямоугольник имеет еще одно свойство, чем квадрат. Квадрат имеет только длину одной стороны, прямоугольник имеет ширину и высоту. Поэтому вы хотите, чтобы Rectangle был получен из Square, хотя это немного противоречит интуиции.

0

Вы можете сделать это, , если вовлеченные классы имеют общий предок, и этот предок достаточно хорош для ваших целей. В этом случае объявите переменную как общий тип предка, но назначьте ей new MoreSpecificType() в зависимости от необходимых критериев.

Что вам нужно сделать, чтобы сделать эту работу так, как вы хотите, это переместить объявление переменной за пределами блоков-фактур if. Причина этого заключается в том, что в Java переменная выходит за пределы области, когда блок, в котором он объявлен, заканчивается, поэтому в вашем коде вы можете на самом деле ничего делать только с myBox в пределах ... частей if() { ... } else { ... }.

0

Основное отличие Java en PHP от раннего или позднего связывания. В Java вы должны указать тип данных и не изменить это позже. Ниже будет иметь смысл:

Rectangle myBox; 
if(length == width){ 
    myBox = new Square(); 
}else{ 
    myBox = new Rectangle() 
} 

Это компилируется нормально, если Square подкласс Rectangle:

class Square extends Rectangle{}; 
Смежные вопросы