与子类化相关的OO设计问题

时间:2013-07-26 12:37:36

标签: oop

我有一个父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中重复同样的事情才能完成这项工作。

3 个答案:

答案 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)

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

这对于设计来说很好。实例化子类对象时,它将具有不同的变量副本。如果实例化超类对象,它将具有不同的副本。