我有一个带有乘法变量的抽象类:
abstract class Animal(var name: String, var age: Int, var mother: Animal,
var father: Animal, var friends: ArrayList<Animal>)
现在,正如您可能已经猜到的那样,我想要创建来自动物的“猫”,“狗”,“鹦鹉”等等。
但是,当我定义Cat类时,我不知道名称,年龄,...字段,因此代码不会编译。
class Cat : Animal()
没有编译,因为我们需要传递我们还不知道的变量。
另一个问题是: 如何在类中启动内部类?一只猫的母亲和父亲都是猫。
答案 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)