gpt4 book ai didi

java - kotlin 内部类的目的是什么?

转载 作者:行者123 更新时间:2023-12-01 09:18:54 32 4
gpt4 key购买 nike

我是 Kotlin 的新手。我正在浏览 kotlin 中的嵌套类和内部类概念。
以下是 的示例嵌套类 .

 fun main(args: Array<String>) {
val demo = Outer.Nested().foo() // calling nested class method
print(demo)
}
class Outer {
class Nested {
fun foo() = "Hello world"
}
}

输出为
Hello world

这是 的示例内部类(Class)。
fun main(args: Array<String>) {
val demo = Outer().Nested().foo() // calling inner class method
print(demo)
}
class Outer {
private val welcomeMessage: String = "Hello world"
inner class Nested {
fun foo() = welcomeMessage
}
}

输出为
Hello world

我的问题是嵌套类何时可以执行与内部类相同的操作。
内部类的目的是什么?为什么我们需要实时内部类?

最佳答案

嵌套类 它本身是一个相当直接的概念,即一个概念在逻辑上依赖于另一个更广泛的概念。每当您发现自己在描述这样一个更广泛的概念的构建 block 时,您希望声明一个新的嵌套类,您不希望自己凭空出现在业务逻辑中。因此,可以通过 访问此类的实例。类的定义它嵌套在。
以如下结构为例:

class Parrot(val name: String): Animal {

//vals and vars useful for a parrot

class HealthyConditions {
val featherColour: String // Does not really apply to Dogs, Cats, Fish, etc.
val cageSize: Size // Does not really apply to Dogs, Cats, Fish, etc.
val weightInGrammes: Int
val dailySleepInHours: Int

fun isUnderweight(currentWeightInGrammes: Int): Boolean {
return currentWeightInGrammes < weightInGrammes
}
}
}
现在,健康生活条件的概念对于任何 Animal 的人来说都是普遍而重要的。这个系统可以描述,但从一个物种到另一个物种,有多个完全不同的因素需要考虑。试图准备一个普通的 HealthyConditions<Animal>一次为所有这些类都可能会导致代码不可读且难以维护,充满 if s 和 else s。因此,开发人员为每个 Animal 定义简洁、整洁的嵌套类可能更有意义。在其自己的。稍后,这些将通过 Parrot.HealthyConditions() 访问。 , Cat.HealthyConditions()等而不是 HealthyConditions.getForSpecies(animal) .

内类是建立在嵌套类思想之上的 Kotlin 概念。虽然某些细节对于给定概念非常具体,因此被描述为嵌套类,但如果这些细节根据更广泛的概念实例而进一步变化怎么办?然后使用类定义访问它可能不是正常运行所需的全部。因此,通过调用 来访问内部类。实例 他们是一个内部类。
让我们回到我们的 Parrot我们可以?
class Parrot(val name: String, var age: Int): Animal {

//vals and vars useful for a parrot

inner class HealthyConditions {
val featherColour: String // Does not really apply to Dogs, Cats, Fish, etc.
val cageSize: Size // Does not really apply to Dogs, Cats, Fish, etc.
val weightInGrammesByAge: Map<Int, Int>
val dailySleepInHoursByAge: Int<Int, Int>

/** variable 'age' from the Parrot class can be accessed only because the HealthyConditions class is marked inner! */
fun isUnderweight(currentWeightInGrammes: Int): Boolean {
return weightInGrammesByAge[age] > currentWeightInGrammes
}
}
}
多少健康 Parrot应该权衡上述鹦鹉一生中的变化。重达几百克的幼体很好,但 2 公斤以下的成年个体可能需要一些注意。因此,是否 Parrot 的问题体重不足 X 克不容易回答,但如果我们问鹦鹉鲍勃是否应该增加一些体重,我们可以使用我们对鲍勃的了解来确定答案。为了做到这一点, HealthyConditions类将通过 Parrot("Bob", 5).HealthyConditions() 访问.

现在,最重要的是,您可能仍然想知道访问父类属性对内部类是否真的有用。毕竟,您可以简单地提供 age无论您调用 isUnderweight()功能,对吧?当然,这是真的,但是在讨论嵌套类时,我们决定每个 Animal值得拥有自己的 HealthyConditions执行。对于 Dog类,狗的品种在确定其正确体重方面与它的年龄一样重要。对于其他物种,性别也很重要。这意味着,如果没有直接访问内部类对其父属性的访问, Healthcheck接口(interface)功能 checkIfUnderweight()为了适用于系统中所有不同种类的动物,必须接受非常多不同的、可能为空的变量。

我花了很多时间在没有很多代码示例的情况下讨论这个概念,但据我了解,您并没有为实现而苦恼,而是首先提出了实现代码的理由。另外,如果我想出的“动物类(class)”示例可能看起来很愚蠢,请原谅我——事实上这是我想出的第一个。 ;)
无论如何,我希望这篇简短的阅读可以帮助您更好地理解这个概念及其用例。安全编码,让错误远离你!

关于java - kotlin 内部类的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59436139/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com