我有一个父bean,它有一个像下面这样的实例变量:
public Class ParentBean {
protected boolean show; // this variable will be used to show some UI component
public void action() {
// update show variable here
}
public boolean isShow() {
return show;
}
}
如果我想在子bean中重用“show”变量(以显示特定于子bean的其他UI组件),它是一个好的设计,如下所示:
public Class ChildBean extends ParentBean {
// override the action method from parent bean
public void action() {
// update show variable here
show = true /false;
}
}
实际上,通过覆盖action()方法,“childBean”正在更新show变量。 这是一个很好的设计实践吗?否则,必须在ChildBean中重复同样的事情才能完成这项工作。
答案 0 :(得分:1)
如果你在子类中使用show
变量用于相同的目的,就像你在这个例子中所做的那样,那么显然你应该重用它,因为否则你最终会两次编写相同的代码,这与OOP的观点相反。
通常,在OOP中,通常会覆盖子类中的超类方法,以及修改超类实例变量,只要您知道要修改的变量用于(你不想在你不完全理解的类中随机更改实例变量,或者不能访问源代码,因为你不需要任何不幸的副作用),所以当它是你自己的代码时,这绝对没问题。
作为一般准则,如果你的选择要么复制并粘贴大量代码并使用它不变,要么子类并使用超类的实例变量或函数,那么最好是子类。否则,你错过了OOP。
答案 1 :(得分:0)
是的。拥有protected
变量意味着您可以将其修改为父类或子类(请记住每个类的每个单个实例都有自己的属性值)。所以,如果你有一些对所有孩子都有价值的通用功能:
家长班:
public void action(){
//update show variable here
show = true;
}
如果您想在特定的孩子中添加一些额外的功能,那么公寓就可以了:
儿童班:
@Override
public void action(){
super.action();
//Extra functionality goes here
//You can also access parent's 'protected' fields
if (show){
System.out.println("Shown");
}
}
使用示例:
Parent p = new Parent();
p.action();//Prints nothing
Child c = new Child();
p.action();//Prints 'shown'
答案 2 :(得分:0)
更改子类中的值不会影响超类变量
这对于设计来说很好。实例化子类对象时,它将具有不同的变量副本。如果实例化超类对象,它将具有不同的副本。