周二去一次面试,在做一个题目中,要求实现一个学生类Student,再实现两个类继承它们,分别表示男生和女生。

当时,匆匆忙忙地,也没多想,把Student类的属性敲上,再在Boy和Girl类中的构造函数中,分别设置this.Sex = true和this.Sex = false。

实际运用中,这样肯定不合理,男生和女生的Sex是固定的(一般情况下,哈),不能在实例创建后修改。只能将Sex属性的set的访问级改成protected。

可是,这个protected实在是太刺眼了,而且因为子类的逻辑而迫使父类作修改,既破坏了开放闭合(OCP)原则,又因为出现Student的地方不能简单地用Boy或Girl替换,违反了LSP原则。不管我们怎么调整子类,这怎么都无法避免。

解决办法还得从Student类开始,这个类应该被设计成抽象类,Sex是抽象属性,从而Boy和Girl类必须实现Sex。虽然题目中说学生要有姓名、出生日期、性别属性,但并没有说一定是具体实现,而应该结合题意通盘考虑。所以,这道题实际上我不及格。

posted on 2012-02-12 21:58  小城故事  阅读(412)  评论(0编辑  收藏  举报