我正在研究一個計算圓形和方形(類)面積的小型練習 java 程式,它實作了一個名為area()的方法的表面(介面) 。一個要求是我必須實作一個名為SumArea的類,該類具有一個名為 calcArea() 的通用方法,該方法接收Circle circ[]和Square square[]陣列并執行面積計算。
程式結構:-> UseSumArea.java(主方法)-> Surface.java(介面)-> Square.java(實作Surface.java的類)->
Circle.java(實作 Surface.java 的類)
-> SumArea.java(執行 calcArea() 方法的類)
UseSumArea.java
public class UseSumArea {
public static void main(String[] args) {
Square square[] = { new Square(2.0), new Square(5.0) };
Circle circ[] = { new Circle(3.0), new Circle(2.0) };
Surface surf[] = new Surface[square.length circ.length];
surf[0] = square[0];
surf[1] = square[1];
surf[2] = circ[0];
surf[3] = circ[1];
SumArea sum = new SumArea();
System.out.println("Square's sum area = " sum.calcArea(square));
System.out.println("Circle's sum area = " sum.calcArea(circ));
System.out.println("Surface's sum area = " sum.calcArea(surf));
}
}
Surface.java
public interface Surface {
public double area();
}
Square.java
public class Square implements Surface {
private double area;
private double side;
public Square(double l) {
this.side = l;
area();
}
@Override
public double area() {
return this.area = (this.side)*(this.side);
}
public double getArea() {
return area;
}
public void setArea(double area) {
this.area = area;
}
public double getSide() {
return side;
}
public void setSide(double side) {
this.side = side;
}
}
Circle.java
public class Circle implements Surface {
private double area;
private double radius;
public Circle (double r) {
this.radius = r;
area();
}
@Override
public double area() {
return area = (((this.radius)*(this.radius))*(Math.PI));
}
public double getRadius() {
return radius;
}
public void setRadius(double raio) {
this.raio = raio;
}
public double getArea() {
return area;
}
public void setArea(double area) {
this.area = area;
}
}
SumArea.java
public class SumArea {
private double area;
public <T> double calcArea(T[] t) { //generic method that receives Square and Circle arrays
double arrayArea = 0;
for (T a : t) {
arrayArea = arrayArea (a.area());
}
return this.area = arrayArea;
}
}
我懷疑這個 SumArea 的代碼片段:
arrayArea=arrayArea ( a.area() );
如何在這個通用方法中訪問每個 Circle 和 Square 物件的 area() 方法?
uj5u.com熱心網友回復:
您需要系結型別變數:
public <T extends Surface> double calcArea(T[] t) {
或者只是將引數宣告為 s 陣列Surface:
public double calcArea(Surface[] t) {
請注意,后者更可取,因為泛型和陣列不能很好地結合在一起。如果您因為其他原因需要一個型別變數,建議更改為 aCollection或類似的:
public <T extends Surface> double calcArea(Collection<T> t) {
(并且,作為一個次要的偏好問題,我會使用S而不是T命名一個擴展的型別變數Surface)
uj5u.com熱心網友回復:
由于Andy Turner已經解決了關于泛型型別的問題,我只想添加與類設計相關的建議。
我認為這些類的設計方式有些冗余。您需要創建一個實體SumArea才能進行計算。并且最后一次calcArea()方法呼叫的結果將存盤在此物件中(假設此計算要復雜得多且消耗 CPU 資源)。
但是我們真的需要將值已經被方法回傳的值存盤在其他地方嗎?在這種情況下,兌現計算歷史(作為單個變數或作為值的集合)的想法似乎沒有用,因為在不知道計算中涉及哪些物件的情況下無法重用它。
如果不存盤結果,此方法將不會系結到狀態,即它必須是靜態的。由于介面可以具有靜態方法,因此可以將其放置在介面中,而不是為此目的創建實用程式類Surface。像那樣。
public interface Surface {
public double area();
public static <T extends Surface> double calcArea(T[] t) { // generic method that receives Square and Circle arrays
double arrayArea = 0;
for (T a : t) {
arrayArea = a.area();
}
return arrayArea;
}
}
請注意,與類相比,在介面中宣告的靜態行為只能通過使用介面的名稱來呼叫:
System.out.println("Circle's sum area = " Surface.calcArea(circ));
area另請注意,兩個類在類中都有一個欄位Circle并且Square只有當其他欄位將被宣告為final時才有意義,即它們必須在物件構造期間僅初始化一個并且設定器變得不必要。
在這種情況下(假設radius已經宣告為final并且在分配時正在驗證reduce > 0)方法area()將如下所示:
@Override
public double area() {
if (area > 0) { // `0` is a default value for instance variables
return area; // reusing already calculated value
}
return area = radius * radius * Math.PI;
}
并且不能有兩種方法area(),getArea()留下一種或另一種。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/437830.html
