我在java中有繼承鏈的問題 我有一個接口幾何,一個類Circle實現幾何,一個類Cylinder擴展Circle。因爲Circle沒有Volume,我將它返回到0.當Cylinder擴展Circle時,Volume返回V = PI * Radius * Radius * Height 但是我創建Cylinder的實例是cy,當它調用getVolume()時,它返回0圈。它如何調用getVolume()本身,而不是Circle? 謝謝。這是我的代碼:如何防止java中的繼承鏈
public interface Geometry {
public double getArea();
public double getVolume();
}
class Circle implements Geometry {
public double R;
public double getArea() {
return Math.pow(R, 2) * Math.PI;
}
public double getVolume() {
return 0; // because not volume of Circle
}
}
class Cylinder extends Circle {
public double Height;
//lateral area of Cylinder
public double getArea() {
double s = super.getArea();
return 2 * s + 2 * Math.PI * super.R * this.Height;
}
public double getVolume() {
return Math.PI * Math.pow(R, 2) * Height;
}
}
public class Main {
public static void main(String[] args) {
Cylinder cy = new Cylinder();
cy.R = 1;
System.out.println(cy.getArea()); // 6.28
System.out.println(cy.getVolume()); // 0 Wrong!!!
}
}
您需要進一步的抽象。聽起來像一個[基本Liskov解僱問題](https://en.wikipedia.org/wiki/Liskov_substitution_principle#A_typical_violation):一個正方形是一個矩形,但是你將無法用正方形替換應用程序中的所有矩形。也許你應該在'Geometry'和'Cylinder'之間有一個支持音量的接口。 –