在Kotlin中使用乘法变量的抽象类继承

时间:2017-07-11 12:20:05

标签: kotlin

我有一个带有乘法变量的抽象类:

abstract class Animal(var name: String, var age: Int, var mother: Animal, 
                      var father: Animal, var friends: ArrayList<Animal>)

现在,正如您可能已经猜到的那样,我想要创建来自动物的“猫”,“狗”,“鹦鹉”等等。

但是,当我定义Cat类时,我不知道名称,年龄,...字段,因此代码不会编译。

class Cat : Animal()

没有编译,因为我们需要传递我们还不知道的变量。

另一个问题是: 如何在类中启动内部类?一只猫的母亲和父亲都是猫。

3 个答案:

答案 0 :(得分:6)

查看有关inheritance

的文档

由于您有主要构造函数,因此必须将参数传递给super

abstract class Animal(var name: String, var age: Int, var mother: Animal, 
                      var father: Animal, var friends: ArrayList<Animal>)

class Cat(name: String, age: Int, mother: Animal, 
          father: Animal, friends: ArrayList<Animal>) 
          : Animal(name, age, mother, father, friends)

答案 1 :(得分:4)

您可以在没有construtor的情况下指定Animal类,并仅在子类型中定义构造函数。

abstract class Animal {
    var name = ""
    var age = 0
    lateinit var mother: Animal
    lateinit var father: Animal
    lateinit var friends: ArrayList<Animal>
}

class Cat: Animal {

    // only initialize the fields you need for this specific type
    constructor(n: String) {
        name = n
    }

    // define a second constructor for your second question
    constructor(m: Animal, f: Animal) {
        mother = m
        father = f
    }
}

答案 2 :(得分:0)

作为旁注,您可以使用泛型来帮助范围

e.g。

abstract class Animal<T : Animal<T>>(
    var name: String,
    var age: Int,
    var mother: T, 
    var father: T,
    var friends: MutableList<Animal>
)

class Cat(
    name: String,
    age: Int,
    mother: Cat,
    father: Cat,
    friends: MutableList<Animal>
) : Animal<Cat>(name, age, mother, father, friends)