【发布时间】:2018-07-21 18:45:34
【问题描述】:
我正在尝试在子类中创建构造函数,但我想将其“继承”变量之一更改为更适合子类的变量,而不更改超类的功能(具体来说,我正在尝试更改类型变量从String 到Object 我在另一个类中创建)。问题是,我无法直接更改或访问该变量,因为它在超类中是私有的,并且该变量没有设置器。
是否有其他方法可以有效地覆盖超类构造函数,这样我就可以在不编辑超类的情况下修改这个“继承”变量?还是在这种情况下我不应该从超类继承,即使所有其他方法大部分都保持不变?
基本上,我想做的是某事像这样:
//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.o是Super.o的补充,它不会覆盖或替换它。正在发生的行为称为阴影。 -
@DanielPryden 我确实打算扩展
Super(我忘了在示例代码中包含它)。但是“阴影”意味着什么?这是否允许Sub中的继承方法使用变量Sub.o,或者除非我覆盖该方法,否则它们只会使用Super.o? -
你不能。但是,属性是用来支持行为的。 OOP 的思想是将对象用于其行为。假设您没有使用 getter,
Superclass必须有一些依赖于String的行为。但是,您希望子类型的行为依赖于不同的属性。我的问题是:有问题的行为是什么,为什么它依赖于String,为什么子类行为需要不同的属性,你确定你没有违反里氏替换原则吗? -
@VinceEmigh 理想情况下,我试图避免改变
Super的整个结构(这样任何已经从它扩展的类都不必改变),但我想偏离@ 987654337@SomeArrayObject是如何创建的。我将ObjectFromAnotherClass作为一个容器,它可以比普通的旧字符串更有效地处理特定信息,但Super(默认情况下)使用字符串,因为它处理非常一般的信息。我只是想知道依靠继承来解决问题是否是错误的设计,或者我做错了什么。真的,我是在尽量避免复制代码
标签: java inheritance constructor subclass