【问题标题】:How to change the type of a variable of a super class in a subclass?如何在子类中更改超类的变量类型?
【发布时间】:2018-07-21 18:45:34
【问题描述】:

我正在尝试在子类中创建构造函数,但我想将其“继承”变量之一更改为更适合子类的变量,而不更改超类的功能(具体来说,我正在尝试更改类型变量从StringObject 我在另一个类中创建)。问题是,我无法直接更改或访问该变量,因为它在超类中是私有的,并且该变量没有设置器。

是否有其他方法可以有效地覆盖超类构造函数,这样我就可以在不编辑超类的情况下修改这个“继承”变量?还是在这种情况下我不应该从超类继承,即使所有其他方法大部分都保持不变?

基本上,我想做的是某事像这样:

//This should not be changed
public class Super
{
    private SomeArrayObject<String> o;
    private String a;
    private SomeObject b;

    public Super(String a, SomeObject b)
    {
        this.a = a;
        this.b = b;
        o = new SomeArrayObject<String>();
    }

    public void someMethod()
    {
        //Does something
    }
}

public class Sub
{
    private SomeArrayObject<ObjectFromOtherClass> o; //Notice the diff?

    public Sub(String a, SomeObject b)
    {
        super(a, b);
        o = new SomeArrayObject<ObjectFromAnotherClass> o;
    }
}

作为一个快速说明,超类中没有“默认构造函数”,所以我不能只使用super()并根据需要填写变量。

【问题讨论】:

  • “继承的”私有变量没有意义。变量不是继承的。最好添加一个例子。但是,您尝试做的事情似乎是不可能的。您将不得不修改超类(并冒着破坏从该超类扩展的其他东西的风险)
  • 我假设您打算将Sub 声明为extends Super?在这种情况下,您有 两个 变量:Sub.oSuper.o 的补充,它不会覆盖或替换它。正在发生的行为称为阴影。
  • @DanielPryden 我确实打算扩展Super(我忘了在示例代码中包含它)。但是“阴影”意味着什么?这是否允许Sub 中的继承方法使用变量Sub.o,或者除非我覆盖该方法,否则它们只会使用Super.o
  • 你不能。但是,属性是用来支持行为的。 OOP 的思想是将对象用于其行为。假设您没有使用 getter,Superclass 必须有一些依赖于String 的行为。但是,您希望子类型的行为依赖于不同的属性。我的问题是:有问题的行为是什么,为什么它依赖于String,为什么子类行为需要不同的属性,你确定你没有违反里氏替换原则吗?
  • @VinceEmigh 理想情况下,我试图避免改变Super 的整个结构(这样任何已经从它扩展的类都不必改变),但我想偏离@ 987654337@ SomeArrayObject 是如何创建的。我将ObjectFromAnotherClass 作为一个容器,它可以比普通的旧字符串更有效地处理特定信息,但Super(默认情况下)使用字符串,因为它处理非常一般的信息。我只是想知道依靠继承来解决问题是否是错误的设计,或者我做错了什么。真的,我是在尽量避免复制代码

标签: java inheritance constructor subclass


【解决方案1】:

我可以看到你的问题。你不能修改它,因为它是私有的吗?并且可以是private 变量,但是在这种情况下,您可以将变量的可见性更改为protected,以便子类可以看到并修改它。

编辑:

看到新信息,你必须再做一些小改动,添加一个泛型,并将变量保护起来,然后创建一个新的泛型类:

public class SuperClassGen<A>  {
    protected ArrayList<A> o;
    private String a;
    private int b;

    public SuperClassGen(String a, int b) {
        this.a = a;
        this.b = b;
        this.o = new ArrayList<A>();
    }
}

public class SuperClass extends SuperClassGen<String> {
    public SuperClass(String a, int b) {
        super(a, b);
    }
}

public class SubClass extends SuperClassGen<ObjectFromOtherClass> {
    public SubClass(String a, int b) {
        super(a, b);
    }
}

这将允许在构造函数中更改子类的类型,而无需

【讨论】:

  • 这不允许他将Object 分配给他的a 属性,这是OP 要求的。
  • @VinceEmigh 你是对的,现在有了新信息,我进行了编辑
  • 这种“某种”解决了这个问题:它需要在语法上更改 Super 类和构造函数(我试图避免)并要求创建一个新类来这样做,但保持与以前相同的功能(这正是我所需要的)。这是一个很好的解决方案,但我希望有一些不会修改Super 结构的东西。但是,如果无法保持Super 的方式做我想做的事,我理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
相关资源
最近更新 更多