gpt4 book ai didi

继承

转载 作者:搜寻专家 更新时间:2023-11-01 04:00:57 26 4
gpt4 key购买 nike

所以我一直在努力寻找正确的方法来让应该非常简单的继承发挥作用(以我想要的方式 ;)),但我失败得很惨。考虑一下:

class Parent
{
public String name = "Parent";

public Parent() {};
public void doStuff()
{
System.out.println(name);
}
}

class Child extends Parent
{
public String name = "Child";
public Child()
{
doStuff();
}
}

我知道 Java 在这种情况下并没有按照我的预期执行,因为出于某种原因,成员变量没有像方法一样被覆盖,但我的问题是实现我想要的行为的正确方法是什么预计?我希望我的基类包含一些函数,这些函数对给定子类提供/定义的成员变量进行操作。我认为 get/sets 可以工作,但它破坏了我调用 super() 并让我的基类执行所需构造的能力,使我的子类包含一堆构造而不是将它隔离到基类。

欢迎任何建设性的建议。

最佳答案

如果你想要这种“变量继承”,你总是可以用 getter 替换变量。不过,不确定“变量继承”((c)) 是否通常是一个好的设计模式。

class Parent {
public void doStuff() {
System.out.println(getName());
}

public String getName() {
return "Parent";
}
}

class Child extends Parent {
public Child() {
doStuff();
}

public String getName() {
return "Child";
}
}

或者您可以在 Parent 类中使用 protected 构造函数,使用该名称。

编辑
我不会称之为“黑客”。将参数传递给父构造函数的版本也可以非常优雅。

class Parent {
private final String name;

// don't let use to invoke this constructor, only for child classes
protected Parent(String name) {
this.name = name;
}

// public constructor for users
public Parent() {
this("Parent");
}

public void doStuff() {
System.out.println(name);
}
}

class Child extends Parent {
public Child() {
super("Child");
doStuff();
}
}

你知道为什么 Java 似乎已经放弃了继承成员变量的概念吗?
Java 已经放弃了很多 C++ 概念(从臭名昭著的多重继承开始),因为它们并没有给语言增加那么多的值(value),反而增加了它的复杂性。
虽然我没有反对变量继承的任何东西,但没有这个概念我也不会感到痛苦。就个人而言,我喜欢简单明了的语言。

关于继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3990093/

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