Java 应该继承包私有字段还是在所有子类中创建私有字段?
我很难理解某些类字段的继承。 如果一个字段在所有子类中都存在,但在所有子类中都不同,我应该如何编写它 我应该这样编码:Java 应该继承包私有字段还是在所有子类中创建私有字段?,java,inheritance,private,Java,Inheritance,Private,我很难理解某些类字段的继承。 如果一个字段在所有子类中都存在,但在所有子类中都不同,我应该如何编写它 我应该这样编码: class Product { private String name; double tax; Product(String name) { this.name = name; } } class CarProduct extends Product { CarProduct(String name) {
class Product {
private String name;
double tax;
Product(String name) {
this.name = name;
}
}
class CarProduct extends Product {
CarProduct(String name) {
super(name);
this.tax = 0.2;
}
}
class PharmacyProduct extends Product {
PharmacyProduct(String name) {
super(name);
this.tax = 0.05;
}
}
还是像这样?哪个更正确
class Product {
private String name;
Product(String name) {
this.name = name;
}
}
class CarProduct extends Product {
private double tax;
CarProduct(String name) {
super(name);
this.tax = 0.2;
}
}
class PharmacyProduct extends Product {
private double tax;
PharmacyProduct(String name) {
super(name);
this.tax = 0.05;
}
}
更新
在@JB Nizet注释之后,我改变了为每个子类设置税值的方式:
class Product {
private String name;
private double tax;
Product(String name) {
this.name = name;
}
setTax(double tax) {
this.tax = tax;
}
}
class CarProduct extends Product {
CarProduct(String name) {
super(name);
this.setTax(0.5);
}
}
class PharmacyProduct extends Product {
PharmacyProduct(String name) {
super(name);
this.setTax(0.05);
}
}
这比前两个好吗?如果tax是所有产品都应该具有的公共属性(这对我来说很有意义,但取决于您的具体用例),我会将
tax
成员保留在基类中,并让继承类将其值传递给基类构造函数:
class Product {
private String name;
double tax;
Product(String name, double tax) {
this.name = name;
this.tax = tax;
}
}
class CarProduct extends Product {
CarProduct(String name) {
super(name, 0.2);
}
}
class PharmacyProduct extends Product {
PharmacyProduct(String name) {
super(name, 0.05);
}
}
您可以将
产品
抽象化。有了这一点,第一种方法似乎是可行的,因为tax
是所有is-a产品的共同点,但是类的字段不应该尽可能地进行封装吗?即使我们必须在每个子类中复制类似于纳税申报的代码,您甚至不应该有一个纳税字段。只是一个始终返回相同值的方法getTax()。另外,Java是否有名为String、Integer和Double的类?否,因为String类的实例是一个字符串。从你的类名中删除s
:这会使代码变得笨拙且难以阅读。你没有听我的评论。你仍然有一个无用的税收领域。相反,在基类中应该有一个抽象的getTax()方法,以及在每个子类中返回一个常量的实现。不需要任何字段。对不起,我是OOP中的noob。必须研究抽象…在我的用户案例中,我希望每个子类的税是固定的,而不是由用户设置的。因此,它只能在实例化时由子类设置。我更新了我的问题,以显示另一种可能的解决方案。@LuísAlves“在实例化时仅由子类设置”这正是上述代码所做的。但这与我的第一个选项不一样吗?@LuísAlves类似,但不完全相同。在第一个选项中,您让继承类直接操作tax
。通过这种方式,它们没有直接访问它的权限,并且可以使用getter和setter(诚然,这里没有显示)来实现更好的封装。