Java 我应该使用内部类吗?里面的示例代码
我喜欢尽可能地整合我的代码/Java 我应该使用内部类吗?里面的示例代码,java,inner-classes,Java,Inner Classes,我喜欢尽可能地整合我的代码/类,而不让每个类本身变得混乱。因此,我考虑使用嵌套类,尽管在本例中使用内部类,因为内部类需要访问外部类的成员 例子 假设我有一个程序,可以计算形状的各种形状属性。因此,给定一个矩形形状,它将从长度和宽度的输入中找到面积/周长 我首先创建一个抽象类形状,它有抽象方法getArea()和getperiment()。然后,我将创建我的子类矩形,扩展形状类,@用必要的逻辑覆盖那些方法 现在有一个矩形棱镜(立方体)。它具有与矩形形状相同的变量/方法,但有一个额外的高度。在过去
类
,而不让每个类
本身变得混乱。因此,我考虑使用嵌套类
,尽管在本例中使用内部类
,因为内部类
需要访问外部类
的成员
例子 假设我有一个程序,可以计算形状的各种形状属性。因此,给定一个矩形形状,它将从长度和宽度的输入中找到面积/周长 我首先创建一个
抽象类形状
,它有抽象方法
getArea()
和getperiment()
。然后,我将创建我的子类
矩形
,扩展
形状类
,@用必要的逻辑覆盖那些方法
现在有一个矩形棱镜(立方体)。它具有与矩形形状相同的变量
/方法
,但有一个额外的高度。在过去,我会创建另一个矩形
的子类
,然后从那里开始
使用内部类
而使用抽象类
PrismShape
是更好还是更差?我这样问是因为无论形状如何,Prisms
都使用相同的方法。如果你对以上内容感到困惑,我会在下面发布我所说内容的代码
示例代码
Shape类
PrismShape类
矩形形状类
我对批评持开放态度,对Java还是相当陌生的。在这期间我的思维过程是我有2d形状属性和3d(棱柱)形状属性。三维形状从二维形状派生属性,而不是从二维形状派生属性。因此,至少对我来说,拥有内部类是有意义的。我自己的看法是:当程序的其余部分有一个外部类的对象时,公共内部类似乎最有用,它希望创建一个内部类的对象,该对象以某种方式“属于”外部类对象;也就是说,它与它紧密相关
然而,按照您的安排方式,这意味着如果客户机想要创建一个RecPrismShape
对象,它必须首先创建一个该prism对象所属的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();
}
}
这个示例设计得很糟糕,因为您的示例基类不包含实现,因此可能只是接口
s,任何类都可以实现任意数量的接口。通常,大多数语言(尤其是Java
)中的内部类仅在声明InnerClass
仅在OuterClass
@aruistante的上下文中使用时才使用,假设我在本例中使用的是抽象,并且实现是计算给定用户输入的形状属性,这有用吗?我尽量保持简洁,长问题并不有趣,尽管我认为这是一个很长的问题。我从来没有改变顶级类,它是set framework。好的,但是在这种情况下,ShapePrism
没有扩展Shape
有什么原因吗?如果要创建一组不同的2D形状和3D形状,它们实际上是独立的类树,我仍然不明白为什么要尝试通过内部类将它们关联起来。没问题。另一件需要考虑的事情是,在这种情况下,2D形状实际上只是高度为0的3D形状的特例,其3D方法将返回0。这是一个设计模式的问题,而不是正确的方法。我建议你一起读这本书。谢谢,我同意你的看法。不过,正如上面有人建议的那样,我将转到另一个方向,每个形状和2d对象都有一个单独的棱柱类,高度为0。
public abstract class PrismShape{
public abstract double getVolume();
public abstract double getSurfaceArea();
public abstract double getLateralArea();
}
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;
}
}
}
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();
}
}