我喜欢尽可能地合并我的代码/ 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)shape属性。 3d形状从2d形状派生其属性,反之则不然。因此,对我来说,至少使用
InnerClasses
是有意义的。 最佳答案
我自己的看法是:当程序的其余部分具有外部类的对象时,公共内部类似乎最有用,它想要创建某种内部类的对象,该对象以某种方式“属于”外部类对象;也就是说,它与之紧密相关。
但是,您安排事物的方式意味着,如果客户端要创建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();
}
}