2013-11-27 3 views
0

Мой супер класс называется многоугольник:Использование классов с наследованием в главном классе Java

public class Polygon 
{ 
private double area; 

/** 
* Constructor for objects of class Rectangle 
*/ 
public Polygon(double area) 
{ 
    this.area = area; 
} 

/** 
* Mutator method that sets the area 
*/ 
public void setArea(double area) 
{ 
    this.area = area; 
} 

/** 
* Accessor method that returns the area 
*/ 
public double getArea() 
{ 
    return area; 
} 
} 

Мой Квадратный класс, который расширяет Polgyon:

public class Square extends Polygon 
{ 
private double perimeter; 

/** 
* Constructor for objects of class Square 
*/ 
public Square(double area) 
{ 
    super(area); 
} 

/** 
* calculates the perimeter of the square using area inherited from Polygon 
*/ 
public void calcPerimeter() 
{ 
    perimeter = Math.sqrt(getArea()) * 4; //in a square, area is the square root 
} 

/** 
* Accessor method that returns the perimeter 
*/ 
public double getPerimeter() 
{ 
    calcPerimeter(); 
    return perimeter; 
} 
} 

У меня есть круг и класс прямоугольник почти то же самое кроме длины, ширины и окружности.

В основном классе я хочу разрешить пользователю вставлять в область, а затем получать периметр квадрата с этой областью, окружность круга с этой областью и т. Д. Я не знаю, сделал ли я это правильно, хотя ... Я создал каждый объект и вставил один и тот же ввод. Вот мой основной класс:

public class PolygonMain 
{ 
public static void main(String[] args) 
{ 
    double input = Double.parseDouble(args[0]); 
    Polygon polygon = new Polygon(input); 
    Square square = new Square(input); 
    Circle circle = new Circle(input); 
    Rectangle rectangle = new Rectangle(input); 
    System.out.println("Area:" + " " + polygon.getArea() + "."); 
    System.out.println("Perimeter:" + " " + square.getPerimeter() + "."); 
    System.out.println("Circumference:" + " " + circle.getCircumference() + "."); 
    System.out.println("Length:" + " " + rectangle.getLength() + "."); 
    System.out.println("Width:" + " " + rectangle.getWidth() + "."); 
} 
} 

Как вы можете увидеть в моем главном классе, я поставил на входе пользователя (арг [0]) в параметр каждого конструктора ..... какой вид делает наследование часть конструкторов, т. е. супер (площадь) .... бесполезная. Нужно ли создавать каждую новую форму? Кроме того, что, если я должен был внедрить класс Scanner в основной класс? Предположим, пользователь может ввести значения области и вернуть информацию о подклассах, а затем сделать это с несколькими значениями области? Как бы я это сделал, поскольку я понятия не имею, как создавать объекты в основном классе. Мы только начали использовать метод Main; наша среда IDE для класса BlueJ, которая не требует этого. Надеюсь, мой вопрос не слишком запутан с формулировкой, и я извиняюсь, если я отформатировал это сообщение неправильно, так как это мой первый пост. Спасибо.

PS: Я забыл упомянуть, что этот квадрат является прямоугольником. Мой профессор допустил ошибку и случайно поручил нам протянуть прямоугольник с квадрата.

PS: Кроме того, в основном классе, где вы, ребята, предложили добавить в коллекцию каждую другую фигуру, а затем повторить каждую и распечатать атрибуты, есть ли у вас другие альтернативы? Как я могу сделать это с помощью класса Scanner? Потому что в приведенной выше ситуации я создаю все объекты. Я стараюсь как можно больше тренироваться с основным классом, потому что я сильно не хватает в нем из-за BlueJ.

+1

Если Цель лаборатории - продемонстрировать полиморфизм, вы, вероятно, хотите создать метод getArea() для каждого типа многоугольника и вызвать это в цикле. Я отвечу, чтобы дать вам представление. – bblincoe

+1

Поскольку ваш класс 'Square' наследуется от' Polygon', вы должны использовать методы периметра до класса «Polygon». Фактически, квадрат также является прямоугольником. – Brian

+2

... а затем 'getPerimeter()' будет находиться в 'Polygon', тогда как каждый конкретный тип (т. Е. Каждый производный класс)' Polygon' переопределит 'calculatePerimeter()'. – CompuChip

ответ

1

Насколько я понимаю, это было бы лучше, чтобы сделать многоугольник абстрактные, и он определить абстрактный метод getPerimiter():

public abstract double getPerimiter(); 

Таким образом, все ваши подклассы должны были бы их собственную реализацию этого метода , Это разумно, потому что все они используют разные вычисления.

Таким образом, вы класс Polygon будет выглядеть следующим образом:

public abstract class Polygon { 

    protected double area; //not private, we want sub-classes to see this field 

    public Polygon(double area) { 
    this.area = area; 
    } 

    public abstract double getPerimiter(); 
} 

И ваш квадрат, например, будет выглядеть следующим образом:

public class Square extends Polygon { 

    public Square(double area) { 
    super(area); 
    } 

    public double getPerimiter() { 
    return Math.sqrt(area) * 4; 
    } 

} 

Все ваши подклассы должны вызывать конструктор, определенный в многоугольник, потому что нет конструктора по умолчанию, поэтому супер (площадь) вызывает квадрат. Кроме того, вы можете обойти все конструкторы и вместо этого использовать метод SetArea (двойной области) в Polygon.

0

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

Polygon может иметь метод, который дает вам область - public double calculateArea() , но вы не знаете, как классы будут вычислять их площади, так чтобы это абстрактный

public abstract double calculateArea()

на площади:

public class Square extends Polygon 
    { 
    private double side; 

    public Square(double side) 
    { 
     this.side= side; 
    } 

    @Override 
    public double calcArea() 
    { 
     return side * side; 
    } 


    public double getSide() 
    { 
     return side; 
    } 
} 

теперь вы можете сделать то же самое с кругом:

public class Circle extends Polygon 
    { 
    private double radius; 

    public Square(double radius) 
    { 
     this.radius= radius; 
    } 

    @Override 
    public double calcArea() 
    { 
     return radius * radius * Math.PI; 
    } 


    public double getRadius() 
    { 
     return radius; 
    } 
} 

в основной метод, вы установите радиус и длину стороны круга и квадрата:

Circle c = new Circle(5); 
Square s = new Square(5); 

, а затем вы можете сделать список многоугольников, перебрать его, и получить площадь:

ArrayList<Polygon> list = new ArrayList<>(); 
list.add(c); 
list.add(s); 

for (Polygon element: list){ 
    System.out.println(list.calcArea()); 
} 
+0

-1 Круг не является многоугольником. – Brian

+1

просто пример того, как вы можете использовать этот метод – Phash

+0

Хорошо спасибо за идею – Abdul

1

Вызов super (area) в конструкторе необходим, потому что Polygon не имеет конструктора без аргументов. Да, необходимо создать каждую новую фигуру, потому что вы работаете с объектами, и вы должны создать их, прежде чем сможете их использовать. Если вы хотите практиковать наследование этого примера вы, вероятно, хотите сделать что-то вроде этого в вашем главном:

Polygon[] shapes=new Polygon[4]; 
shapes[0]=new Polygon(input); 
shapes[1] = new Square(input); 
shapes[2] = new Circle(input); 
shapes[3] = new Rectangle(input); 

for(Polygon p:shapes){ 
    System.out.println(p.getArea()); 
} 

И видите, что все различные объекты в массиве наследуют метод GetArea() из Polygon. С другой стороны, если вы хотите вызвать определенный метод, который был при условии в подклассе - говорит getPerimeter() - вы должны бросить ссылку подкласса или вы не сможете использовать его:

Polygon mySquare=new Square(100); 
System.out.println(((Square)mySquare).getPerimeter()); 
+0

Спасибо, я добавлю это. И эта ссылка, которую вы только что показали, очистила ссылку на квадрат как квадрат, в то время как для меня все еще много полигона. – Abdul