当前位置: 首页 > 知识库问答 >
问题:

如何使子字段影响父方法

桓智敏
2023-03-14

所以我有家长和孩子班。我希望他们输出一些字段的值(如果存在),并且存在问题。

open class Parent {
    // there can be 'name' field with some value

    // if 'name' field exists, try block will be executed otherwise catch
    override fun toString(): String {
        return try {
            val name = this.javaClass.getDeclaredField("name").get(this)
            "name exists: $name"
        } catch (e: Exception) {
            "name does not exist"
        }
    }
}

open class Child : Parent() {
    open val name = "child!"
}

fun main() {
    val parent = Parent()
    println(parent)

    val child = Child()
    println(child)
}

子类具有字段“name”,但结果具有两个字符串“name 不存在”。此外,如果父类中有名称,则第二个字符串无论如何都将是“名称不存在”。

我设法捕获了错误:IllegalAccessException-父类无法访问子字段,尽管子字段是打开的,还有“名称”字段。它还告诉孩子的成员是最终的和私有的。

我做错了什么?我希望每个类都输出字段名的值(若存在)。也许我应该为每个类显式编写toString()函数?

共有1个答案

牛越
2023-03-14

在父类中声明 name,默认为 null 并允许子类设置它,不是更好吗?这样,您可以对字段进行空检查,以查看它是否“存在”。

open class Parent {
    open val name: String? = null

    override fun toString(): String = name ?: "name does not exist"
}

open class Child : Parent() {
    override val name = "child!"
}

现在,您正在使用反射(这通常是一个警告标志),并且您的超类了解其子类的实现细节(它可能有一个名为<code>name</code>的字段)。如果父级应该知道该字段,为什么不显式地将其作为继承系统的一部分,而不是使用反射来处理它?它非常脆弱,除非你有充分的理由去处理这些东西,否则最好只在语言中工作(及其局限性)

 类似资料:
  • 问题内容: 我正在使用一个非常精美的webkit过滤器来使背景图像变成灰度,然后将鼠标悬停在图像上变成彩色。 这是过滤器 如您所见,甚至具有“过渡”属性,因此图像具有平滑的淡入淡出过渡到全彩色的效果。我遇到的问题是我将其应用于div也会影响位于div内的子文本,并将文本也变为灰度。这是一个问题,因为即使未悬停在文本上,文本也必须为白色。 我试着在子文本上将过滤器与另一个过滤器取反,但这似乎不起作用

  • 实际上,下面的代码不能用这个命令用Clang编译: . 我只想模仿与C中的“交换习惯用法”相同的行为,使用“using directive”来启用ADL。但是下面的代码哪里错了呢?预期的调用优先级应为:N1::foo 错误消息: 更新: 我将N2::foo更改为可以在某种程度上模仿std::交换的模板方法。所以,这里的问题是为什么不能由在函数中?因为当它们具有相同的优先级时,该函数应该比要调用的模

  • 我的背景是C,在那里我们可以使用子类对象访问父类的公共字段。示例: 如何在Java继承中实现同样的功能? 我还有另一个关于覆盖的问题,但由于Stackoverflow规则,我将作为单独的问题提问。 那么,使用子类对象引用打印/访问Java的父类方法的语法应该是什么?我尝试了。等,但不工作。

  • 问题内容: 有没有办法做到这一点? 注意:我没有,因此with类不起作用。 问题答案: 您可以通过覆盖 init 方法来更改子类中的字段:

  • 父类: 子电话对象(第一级): 我正在尝试获取person对象,其phone对象类型为home,其编号应包含“888”。 从上面的流代码,我能够得到手机对象。但是如何在相同的函数中获得该电话对象的父对象呢?。 我尝试了这种方式,我得到null不匹配的对象。

  • 问题内容: some stuff, images etc 我想要的是让.container div具有80%的不透明度,但是.site_content的内容为100% 设置CSS不透明度会影响所有子元素。有办法吗?使用jQuery吗? 由于此方法的使用方式,我宁愿避免在后面放置另一个透明div来获得效果的技术。 问题答案: 您需要在容器div上使用RGBA背景属性。。64、64、64是RGB颜色值