我喜欢尽可能地合并我的代码/ classes,而每个class本身不会变得混乱。因此,我研究了使用NestedClasses的情况,尽管在这种情况下使用的是InnerClasses,因为InnerClass需要访问OuterClass的成员。





可以说我有一个程序,可以计算各种形状的形状属性。因此,给定矩形形状,它将从长度和宽度的输入中找到面积/周长。

我首先创建一个abstract class Shape,它具有abstract methods getArea()getPerimeter()。然后,我将使用必要的逻辑创建我的subclass RectangleShapeextend形状class@Override那些methods

现在有一个矩形棱镜(立方体)形状。它具有与variables相同的methods / RectangleShape,但高度额外增加了一个。在过去,我将创建另一个subclassRectangleShape并从那里开始。

使用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();
    }

}

07-28 12:06