我希望尽可能地合并我的代码/ classes
,而不会让每个class
本身变得混乱。所以我在这种情况下使用NestedClasses
但InnerClasses
,因为InnerClass
需要访问OuterClass
的成员。
假设我有一个计算各种形状属性的程序。因此,给定一个矩形形状,它将从长度和宽度的输入中找到面积/周长。
我首先会创建一个abstract class Shape
,其中包含abstract methods
getArea()
和getPerimeter()
。然后,我将使用必要的逻辑创建我的subclass
RectangleShape
,extend
形状class
,@Override
那些methods
。
现在有一个形状矩形棱镜(立方体)。它与variables
具有相同的methods
/ RectangleShape
,但有一个额外的高度。在过去,我会创建另一个subclass
RectangleShape
并从那里开始。
使用InnerClass
而不是abstract class
PrismShape
更好/更差?我问这个是因为Prisms
分享相同的方法,无论形状如何。如果您对上述我发布的代码感到困惑,请发布以下代码。
Shape Class
public abstract class Shape {
public abstract double getArea();
public abstract double getPerimeter();
}
PrismShape Class
public abstract class PrismShape{
public abstract double getVolume();
public abstract double getSurfaceArea();
public abstract double getLateralArea();
}
RectangleShape Class
import Abstract.Shape;
import Abstract.ShapePrism;
public class RectangleShape extends Shape{
//Variables Declared
private double _length, _width;
//Constructor
public RectangleShape(double _length, double _width) {
setLength(_length);
setWidth(_width);
}
//Getters and Setters
@Override
public double getArea() {
return getLength() * getWidth();
}
@Override
public double getPerimeter() {
return (2 * getLength())+ (2 * getWidth());
}
public double getLength() {
return _length;
}
private void setLength(double _length) {
this._length = _length;
}
public double getWidth() {
return _width;
}
private void setWidth(double _width) {
this._width = _width;
}
//Inner Class Prism
public class RecPrismShape extends PrismShape{
//Variables Declared
private double _height;
//Constructor
public RecPrismShape(double _height) {
setHeight(_height);
}
//Getters and Setters
@Override
public double getSurfaceArea(){
return (getLateralArea() + (2 * getArea()));
}
@Override
public double getVolume(){
return getArea() * getHeight();
}
@Override
public double getLateralArea(){
return getPerimeter() * getHeight();
}
public double getHeight() {
return _height;
}
private void setHeight(double _height) {
this._height = _height;
}
}
}
我对批评持批评态度,对Java来说还是比较新的。我在此期间的思考过程是我有2d Shape属性和3d(Prism)形状属性。 3d Shapes从2d形状派生出它们的属性,但反之则不然。所以对我来说至少让InnerClasses
有意义。
答案 0 :(得分:1)
我自己对此的看法:当程序的其余部分具有外部类的对象时,公共内部类似乎最有用,并且它想要创建内部类的对象,该对象属于"属于"以某种方式到外层对象;也就是说,它与它紧密相关。
你安排事情的方式,但是,这意味着如果客户想要创建一个RecPrismShape
对象,它必须首先创建一个RectangleShape
对象,棱镜对象将属于该对象至。最有可能的是,这不会有用。也就是说,客户创建RectangleShape rect
只是因为必须创建RecPrismShape
,而rect
对象不会以任何其他方式对其有用
我认为更好的想法是让RecPrismShape
对象有一个private RectangleShape
对象作为其中一个字段,但这将是一个"实现细节"。这样,您就可以重复使用RectangleShape
代码,而您似乎正在尝试这样做。
public class RecPrismShape extends RectangleShape {
private RectangleShape rect;
private double height;
public RecPrismShape(double length, double width, double height) {
rect = new RectangleShape(length, width);
this.height = height;
}
// and just one example of how you could use it
public double getVolume() {
return rect.getArea() * getHeight();
}
}