子类中的访问方法

时间:2019-11-04 23:00:39

标签: kotlin multiple-inheritance

我对科特林不满意,并试图创建一个简单的生物等级体系。我似乎已经能够成功完成此操作,但是,我无法访问属于Human:Creature类的孩子的“ Head:Appendage”类中的“ think”方法

我可以看到子类一直打印到head类,但是我无法运行think()方法

val human = Human()
println(human.appendages["Head"])           // [Head@3803641]
println(human.appendages["Head"]?.get(0))   // Head@3803641
human.appendages["Head"]?.get(0).think()    // uncaught reference
import org.omg.CORBA.Object
import java.util.*

open class Creature {
    var appendages = HashMap<String,ArrayList<Appendage>>()
}
open class Appendage {
    constructor() {}
}
open class Human : Creature {
    constructor()
    {
        appendages["Arm"] = ArrayList<Appendage>()
        appendages["Arm"]?.add(Arm())
        appendages["Arm"]?.add(Arm())
        appendages["Leg"] = ArrayList<Appendage>()
        appendages["Leg"]?.add(Leg())
        appendages["Leg"]?.add(Leg())
        appendages["Head"] = ArrayList<Appendage>()
        appendages["Head"]?.add(Head("Human"))
    }
}
class Alien : Creature
{
    constructor()
    {
        appendages["Tentacle"] = ArrayList<Appendage>()
        appendages["Tentacle"]?.add(Tentacle())
        appendages["Tentacle"]?.add(Tentacle())
        appendages["Tentacle"]?.add(Tentacle())
        appendages["Tentacle"]?.add(Tentacle())
        appendages["Arm"] = ArrayList<Appendage>()
        appendages["Arm"]?.add(Arm())
        appendages["Arm"]?.add(Arm())
        appendages["Leg"] = ArrayList<Appendage>()
        appendages["Leg"]?.add(Leg())
        appendages["Leg"]?.add(Leg())
        appendages["Head"] = ArrayList<Appendage>()
        appendages["Head"]?.add(Head("Alien"))
        appendages["Head"]?.add(Head("Alien"))
    }
}

class Head : Appendage {
    private var whatami : String = ""
    constructor(whatami : String)
    {
        this.whatami = whatami
    }
    public fun think()
    {
        println("$whatami Thinking")
    }
}
open class Arm : Appendage {
    private var rotation = mutableListOf<Int>(0,0,0)
    constructor() {}
    fun rotateX(degrees: Int)
    {
        rotation[0] = degrees
    }
    fun rotateY(degrees: Int)
    {
        rotation[1] = degrees
    }
    fun rotateZ(degrees: Int)
    {
        rotation[2] = degrees
    }
}
open class Leg : Appendage {
    private var rotation = mutableListOf<Int>(0,0,0)
    constructor() {}
    fun rotateX(degrees: Int)
    {
        rotation[0] = degrees
    }
    fun rotateY(degrees: Int)
    {
        rotation[1] = degrees
    }
    fun rotateZ(degrees: Int)
    {
        rotation[2] = degrees
    }
}
open class Tentacle : Appendage {
    private var rotation = mutableListOf<Int>(0,0,0)
    constructor() {}
    fun rotateX(degrees: Int)
    {
        rotation[0] = degrees
    }
    fun rotateY(degrees: Int)
    {
        rotation[1] = degrees
    }
    fun rotateZ(degrees: Int)
    {
        rotation[2] = degrees
    }
}

我希望程序打印出“人类思维”,但出现“未引用”错误

1 个答案:

答案 0 :(得分:0)

正如Tom所说,您的编译器对类型一无所知。您需要进行如下简单的转换:

(human.appendages["Head"]?.get(0) as Head).think()