1

我有一个父 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 中重用“显示”变量(以显示特定于子 bean 的其他 UI 组件),这是一个好的设计,如下所示:

public Class ChildBean extends ParentBean {
    // override the action method from parent bean 
    public void action() {                      
        // update show variable here 
        show = true /false;
    }           
}

实际上,显示变量正在由“childBean”通过覆盖 action() 方法进行更新。这是一个好的设计实践吗?否则,必须在 ChildBean 中重复相同的操作才能完成这项工作。

4

3 回答 3

1

如果您show在子类中将变量用于相同的目的,就像您在此示例中所做的那样,那么显然您应该重用它,因为否则您最终只会编写两次相同的代码,这与 OOP 的观点相反.

一般来说,在OOP中,在子类中重写超类方法,以及修改超类实例变量是很常见的,只要你知道你正在修改的变量是用来做什么的(你不希望随机改变实例你不完全理解的类中的变量,或者无法访问其源代码,因为你不想要任何不幸的副作用),所以当它是你自己的代码时,这绝对没问题。

作为一般准则,如果您的选择是复制并粘贴大量代码并原封不动地使用它,或者子类化并使用超类的实例变量或函数,那么子类化会更好。否则,您将错过 OOP 的意义。

于 2013-07-26T12:43:26.120 回答
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'
于 2013-07-26T12:43:00.440 回答
0

更改子类中的值不会影响超类变量

就设计而言,这很好。当一个子类对象被实例化时,它会有一个不同的变量副本。如果超类对象被实例化,它将有不同的副本。

于 2013-07-26T12:44:39.597 回答