我应该使用内部课吗?示例代码里面

时间:2014-04-02 23:49:52

标签: java inner-classes

我希望尽可能地合并我的代码/ classes,而不会让每个class本身变得混乱。所以我在这种情况下使用NestedClassesInnerClasses,因为InnerClass需要访问OuterClass的成员。


实施例

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

我首先会创建一个abstract class Shape,其中包含abstract methods getArea()getPerimeter()。然后,我将使用必要的逻辑创建我的subclass RectangleShapeextend形状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有意义。

1 个答案:

答案 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();
    }

}