如何在子类中初始化抽象类Base的变量Q?
实现方案
首先要解决两个核心问题:一是让抽象类Base能访问到Q对象,二是在子类中正确初始化对应类型的Q。以下是两种可行的实现方式:
方案一:通过构造参数传递(推荐)
这种方式更符合依赖注入思想,代码简洁且灵活:
- 修改抽象类
Base,将Q作为构造参数传入,确保Buscar方法能直接访问:
inner abstract class Base(val Q: Secuencia<*>) { fun Buscar(): Int { // 在这里使用Q执行操作,比如Q.add(...)、Q.remove(...)等 return 0 // 根据实际逻辑返回结果 } }
- 子类直接在主构造器中传入对应类型的实例:
inner class BFS : Base(Cola()) inner class DFS : Base(Pila())
方案二:定义抽象属性由子类重写
如果希望子类固定绑定特定的Q类型,可以用这种方式:
- 在
Base中声明抽象属性Q:
inner abstract class Base { abstract val Q: Secuencia<*> fun Buscar(): Int { // 使用Q执行操作 return 0 } }
- 子类重写属性并初始化:
inner class BFS : Base() { override val Q = Cola() } inner class DFS : Base() { override val Q = Pila() }
原代码的问题说明
- 原
Base类未声明Q属性,导致子类中的Q无法被Buscar方法访问; - 子类中的
constructor(): this()是递归构造调用,会引发编译错误,完全不需要这样写。
注:如果
Secuencia的泛型需要具体类型(比如操作Int类型元素),可以将Secuencia<*>替换为Secuencia<Int>,根据实际业务调整。
内容的提问来源于stack exchange,提问作者winnie
相关产品推荐
相关产品推荐

