Java继承

use*_*315 3 java inheritance

所以我一直在努力寻找合适的方法来获得应该是非常简单的继承功能(我想要的方式;))并且我失败了.考虑一下:

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

欢迎任何建设性的建议.

Nik*_*bak 8

如果你想要这种"变量继承",你总是可以用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";
    }
}
Run Code Online (Sandbox Code Playgroud)

或者你可以在Parent类中使用受保护的构造函数,并使用名称.

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

你有没有想过为什么Java似乎已经放弃了继承成员变量的概念?
Java已经放弃了许多C++概念(从臭名昭着的多重继承开始),因为它们没有为语言增加那么多价值,但增加了它的复杂性.
虽然我没有任何反对变量继承的东西,但我也没有没有这个概念.就个人而言,我喜欢简单干净的语言.


Jon*_*eet 6

对于单个实例,您真的需要两个不同的name变量吗?你是否真的有这样一个想法:一个物体有一个"被视为父母的名字"和一个"被视为儿童的名字"?如果没有,只需在Parent类中有一个变量.

Parent课程将如何知道孩子将提供哪些变量?如果每个子类都具有相同的变量集,为什么它们不在父类中?

如果你能给出一个你试图解决的问题的更具体的例子,它将更容易给出具体的答案.