抽象类变量与子类变量选择:为Dog类加DogHouse变量的最优方案
给Dog类加DogHouse变量?选这个方案准没错!
先明确咱们的前提:
假设所有动物都拥有居所,且每种动物仅居住在其专属的特定居所中。
我先把常见的三个选项补全(毕竟原选项是空的,都是OOP里的典型思路),然后挨个分析:
选项1:在抽象Animal类里加个通用的house变量
比如定义成private House house;(如果有抽象House父类)或者更泛的类型。
- 好处:所有动物的居所持逻辑都能统一在父类管理,比如
getHouse()、setHouse()这些方法不用子类重复写。 - 坑点:要是每种动物的居所差异特别大——比如DogHouse有专属的
getToyBox()方法,CatHouse有getScratchingPost()——用通用类型就得频繁强转,不仅麻烦,还容易出类型错误,也违背了里氏替换原则,代码可读性直接下降。
选项2:直接在Dog子类里加DogHouse变量
就是只在Dog类里声明private DogHouse dogHouse;,其他动物子类各自管自己的居所。
- 好处:完全贴合咱们的前提,类型绝对安全,不用转来转去,Dog类直接调用DogHouse的专属方法,代码一目了然。
- 坑点:如果多个动物子类都有类似的居所操作(比如都要实现
cleanHouse()),就得重复写代码,违反了**DRY(Don't Repeat Yourself)**原则,后期维护起来头疼。
选项3:抽象Animal类定义抽象方法,子类实现返回专属居所
比如在Animal类里写:
public abstract House getHouse();
然后Dog类里持有DogHouse变量,重写方法返回它:
@Override public DogHouse getHouse() { return this.dogHouse; }
- 好处:完美平衡了统一规范和类型安全!父类定下"动物必须有居所"的规矩,子类可以返回自己专属的居所类型(利用协变返回类型),既不用重复写通用逻辑,又不会有类型转换的麻烦,扩展性还强——以后加个Bird类,直接返回BirdCage就行。
- 坑点:得先定义个抽象House类或者接口,多了一点点架构成本,但这绝对是值得的,长远来看代码会更健壮。
结论:最优方案是选项3
结合咱们的背景要求,选项3既满足了所有动物都有居所的抽象约束,又让每个子类能持有自己专属的特定居所,兼顾了可维护性、类型安全和扩展性。要是你项目里还没抽象House的基础,选项2也能凑合用,但从长远架构来看,选项3绝对是最好的选择。
内容的提问来源于stack exchange,提问作者Julian Jiang
相关产品推荐
相关产品推荐

