这个类有很多错误:
你有一个 BreadcaloriesPerSlice,但构造函数使用与 int 相同的变量。
FillingcaloriesPerServing 和 intcaloriesPerServing 相同。
它有一个私有构造函数。此构造函数指定您可以访问此类型的类的唯一方法是通过类中的静态方法,该方法返回一个 Sandwich 对象(如单例模式),这里不是这种情况。
类是私有的:也许我错了,但是java中的私有类意味着没有人可以访问它。
构造函数:例如breadType是一个字符串对象,没有用到。您正在尝试使用私有变量来设置面包……那是什么?
构造函数:caloriesPerSlice 是一个 int 类型,您可以在接收 Bread 类型的 setBread() 设置器中使用它。你在混合类型。
与在setFilling()中使用的caloriesPerServing相同,它接收一个Filling对象......
getTotalCalories:分配在右侧,而不是左侧。
我认为您对 OO 有误解。例如,让我们看一下 Bread 类:
如果面包类具有 caloriesPerSlice 和 breadType 属性,它们可能是面包类型的一部分。让我们更改类以反映这些属性:
public class Bread {
private int caloriesPerSlice;
private String type;
public Bread(String type, int caloriesPerSlice)
{
this.type = type;
this.caloriesPerSlice = caloriesPerSlice;
}
public int getCaloriesPerSlice()
{
return this.caloriesPerSlice;
}
public String getType()
{
return this.type;
}
}
在这种情况下,面包是通过他的构造函数完全定义的。您可以看到该类没有设置器。那是因为我决定了它,但是如果你想要一个无参数的构造函数和类中的设置器,这取决于你。在这种情况下,我只定义了 getter。让我们看看 Filling 类:
public class Filling {
private int caloriesPerServing;
private String type;
public Filling(String type, int caloriesPerServing) {
this.caloriesPerServing = caloriesPerServing;
}
public int getCaloriesPerServing()
{
return hits.caloriesPerServing;
}
public void setCaloriesPerServing(int calories)
{
this.caloriesPerServing = calories;
}
public String getType()
{
return this.type;
}
public void setType(String type)
{
this.type = type;
}
}
这里的 Filling 类有 getter 和 setter。这只是为了解释的目的:在 Filling 类中,您可以通过构造函数或 setter 设置属性,而在 Bread 中,您只能通过构造函数定义属性。
现在三明治可能可以接收定义面包和馅料的所有属性(就像您的情况一样),或者它可以接收面包和馅料)。我们来看第一种情况:
public class Sandwich {
private Bread bread;
private Filling filling;
public Sandwich(String breadType, int caloriesPerSlice, String fillingType, int caloriesPerServing) {
this.bread = new Bread(breadType, caloriesPerSlice);
this.filling = new Filling(fillingType, caloriesPerServing);
}
public Bread getBread() {
return bread;
}
public void setBread(Bread bread) {
this.bread = bread;
}
public int getTotalCalories() {
return this.bread.getCaloriesPerSlice() * 2 + this.filling.getCaloriesPerServing();
}
}
如您所见,我们在 Sandwich 构造函数中收到了定义面包和馅料的所有参数。然后,我们创建了 Bread 和 Filling 对象,并传递了它们的参数。最后,getTotalCalories 只不过是面包和馅料属性的简单数学运算。
这段代码只是在文本编辑器中编写的。没检查好不好。
在这个例子中,Sandwich 变成了一个类和一个工厂,是类的一个非常重要的组成部分。如您所见,Bread 和 Filling 类的构建是通过 Sandwich 完成的。它的优势在于 Sandwich 控制对象的创建,但问题是:三明治是否对此负责?也许不是,因为当您在家中制作三明治时,您会得到面包和其他成分,你只是把它们放在切片上......三明治不负责面包片的制作......它在现实生活中没有意义。那么,在 Sandwich 构造函数中删除对象创建可能是个好主意:
public Sandwich(Bread bread, Filling filling) {
this.bread = bread;
this.filling = filling
}
这种情况更“正确”,因为您正在使用已在内存中生成的元素制作三明治。在家里做三明治也是一样:先拿到面包、馅料,然后再做三明治。
我希望这可以进一步说明 OO。
您好!