android 从基类访问超类中的成员

vwoqyblh  于 2022-12-02  发布在  Android
关注(0)|答案(4)|浏览(105)

下面是Kotlin中继承的一个例子:

abstract class Animal(val size: Int)
class Dog(val cuteness: Int): Animal(345)

var dog: Dog = Dog(10)
var animal: Animal = dog

var x = 0
...

如果您在最后一行设置断点,变量animal将被设置为dog的示例。但是,您只能访问Animal中的size成员。您无法访问Dog中的cuteness成员。但Android Studio的调试器仍允许您查看animal变量中的可爱成员的值。
有没有办法在代码中访问这些隐藏成员?我不认为有。我认为Android Studio知道它们是什么,并将它们显示给您用于调试目的,但由于它们无法通过Kotlin访问,因此它将阻止您在代码中实际访问它们。也许我错了?

68bkxrlz

68bkxrlz1#

我知道这个问题已经得到了回答,但我想补充一些信息。
当你声明animal变量的时候,你会把它的类型设为Animal,所以animal不能是别的,如果你给它赋值一个继承自Animal的类型,比如Dog,那么Dog会被强制转换为Animal,这就是你的例子,所以你只能访问animal成员.
但是,您可以使用asAnimal转换回其原始类型Dog

(animal as Dog).cuteness

但是要小心,如果Animal不是Dog,你的程序会崩溃,所以你可以使用as?的安全转换,它会返回一个可空的Dog?,如果出错了,它会返回null,而不是抛出一个异常:

val safeDog: Dog? = (animal as? Dog)
safeDog?.cuteness
vddsk6oq

vddsk6oq2#

你只需要使用铸造:
将动物(对象)铸造为狗类型,你可以访问可爱的字段,你也可以改变它的值,如果你愿意

val dog: Dog = Dog(10)
  val animal: Animal = dog

  println(animal.size)
  println((animal as Dog).cuteness)

我承认这不是最好的解决方案,但效果很好

ogsagwnx

ogsagwnx3#

你想接近动物的可爱。你必须为此而使用。

(animal as Dog).cuteness
ahy6op9u

ahy6op9u4#

我不确定,但是如果父类型可以访问它的子only特定属性,它会抛出继承提供的所有东西吗?
我能想到的唯一方法是Animal有一个开放的属性cuteness,它可以被其子级继承

abstract class Animal(val size: Int, open val cuteness: Int)

class Dog(override val cuteness: Int): Animal(345, cuteness)

这样,Dog示例或声明为Animal类型的任何示例都可以按您希望的方式调用cuteness

animal.cuteness

或者简单地像另一个答案一样,将其转换回Dog类型

相关问题