У меня есть класс Figure, который описывает площадь и периметр. У меня есть также множество фигур, унаследованных от этого класса. Как я могу задать для каждой фигуры определение площади и периметра? Можно это делать в конструкторе (как я и сделал) или же необходимо переопределять сеттер родителя? Или вообще иначе как-то я должен сделать? Подскажите пожалуйста. Заранее спасибо
Вот класс родитель для всех фигур:
public class Figure {
private double area;
private double perimeter;
public double getArea() {
return area;
}
public void setArea(double area) {
this.area = area;
}
public double getPerimeter() {
return perimeter;
}
public void setPerimeter(double perimeter) {
this.perimeter = perimeter;
}
}
Вот мой круг:
public class Cirlce extends Figure {
private double radius;
public Cirlce(double radius) {
this.radius = radius;
super.setArea(radius*2*Math.PI);
}
}
Класс Circle:
UPD:Код был переделан,по желанию автора, теперь переменные класса Figure нельзя изменять, задаются один раз при создании
В конструкторе лучше не помещать какие либо вычисления, ибо там могут быть викунуты различные исключения, так же лучшек не помещать туда методов, так как вызов некоторых методов, в которых , например, могут быть заранее не определены или не инициализированы какие либо переменные. Однако, метод может быть вызван, если вы на 100% знаете, что там не будет описаных выше проблем. Такой метод желательно должен только определять объект, и манипулировать только переменными, которые он получает, иначе, как говорил раннее , может быть проблема. В mathArea() и mathPerimeter() необходимо будет создать обработку исключений. Есть так называемый public static метод, в который передается значение радиуса, и если оно не соблюдает условия, объект не создается, без этого метода в конструкторе, в методе setRadius(..); при передачи отрицательного значения объект бы был СОЗДАН, и возвращал бы дэфолтные значения double area и parameter, что не допустимо. Есть исключение NullPointerException при попытке создать и изменить объект , как показано в qew.java , и необходимо для каждой фигуры устанавливать индивидуальную обработку исключений в методах, при создании и тд, где это собственно возможно. Так же есть другие плюсы такой архитектуры, если интересно какие , отпишите
public class Circle extends Figure {
private double radius;
public static Circle createCircle(double radius)
{
if(radius <= 0) {System.out.println("WHY ? Stop it...");return null;} else return new Circle(radius);
}
public Circle(double radius) {
setRadius(radius);
}
private double mathArea()
{
return Math.pow(radius,2)*Math.PI;
}
private double mathPerimeter()
{
return 2*radius*Math.PI;
}
private void setRadius(double radius){
this.radius = radius;
super.setPerimeter(mathPerimeter());
super.setArea(mathArea());
}
}
Класс qew.java , у меня с main методом: Тест, попытка создать объект, с отрицательным радиусом.
public class qew {
public static void main(String[] args) {
Circle c = Circle.createCircle(4);
System.out.println(c.getArea());
System.out.println(c.getPerimeter());
}
}
Класс Figure: Класс абстрактный, ибо зачем нужны его экземпляры, он должен предоставлять ОБЯЗАТЕЛЬНЫЕ переменные, которые 100% будут использованы для его потомков, иначе, нужно определить их в классах - потомках. К методам это относится так же.
abstract public class Figure {
private double area;
private double perimeter;
public double getArea() {
return area;
}
public void setArea(double area){
this.area = area;
};
public double getPerimeter() {
return perimeter;
}
public void setPerimeter(double perimeter){
this.perimeter = perimeter;
};
}
Вы можете создать абстрактный класс Figure и в нем задать поля "площадь" и "периметр". А потом создать абстрактные методы getPerimetr и getArea и в каждом классе который наследуется от фигуры переопределять их.
public abstract class Figure {
private double area;
private double perimeter;
public double getArea();
public double getPerimeter();
}
public class Cirlce extends Figure {
private double radius;
public Cirlce(double radius) {
this.radius = radius;
}
@Override
public double getArea(){
return radius*radius*Math.PI;
@Override
public double getPerimeter(){
return radius*2*Math.PI;
}
}
public class Rectangle extends Figure {
private double length;
private double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
public double getArea(){
return length*width;
@Override
public double getPerimeter(){
return 2*(length*width);
}
}
А вычислять в конструкторе ничего не стоит
Виртуальный выделенный сервер (VDS) становится отличным выбором
Я использую Webview и мне бы хотелось в один момент получить все Cookie и сохранить ихВ другой же момент, мне бы хотелось загрузить все Cookie из одного...
По некоторым причинам выполнил вертикальное выпадающее меню на сайте с помощью detailsПри наведении мыши появляется выпадающий список
Имеется такой кусок, пытаюсь вызвать метод класса внутри конструктора, те