【发布时间】:2020-08-17 04:16:46
【问题描述】:
更新:我可以将变量从私有、静态或最终更改。
我有一个父类和一个子类。我想重用 parent 类中的方法。通常,这就像super.methodFromParentClass() 一样简单,您就完成了。 然而,当我这样做时,我想要重用的方法是使用来自Parent类的实例变量数据,即错或者更确切地说,我确实不想要这种行为。我在子类中有 DIFFERENT 初始化数据,这些数据需要传递到我想要重用的方法中。如果你看一下我想重用的方法(下面只是一个简单的例子,但想法是一样的),我在那里创建了多个对象,这些对象使用它调用的类的实例变量。所以你可以看到为什么当我调用 super.methodIWantToReuse 时它不起作用,因为它会获取父数据并将其传递给对象,即使我真的想要它传递我在子类中初始化的数据。我的真实示例还创建了更多的对象,并且我有更多的实例变量,所以我真的想尽可能地重用这段代码(DRY 原则)。
我该如何解决这个问题?将使用 getters 即 getFirstName() 并在 Child 类中覆盖它们,因此当我调用 super.methodIWantToReuse() 时使用 Runtime Polymorphism,将 抓取/使用 Child 类实例变量数据是唯一途径???
public class ParentClass {
private static final String firstName = "Billy Ray";
private static final String lastName = "Cyrus";
private static final int age = 58;
private static final String city = "Hunstville";
public boolean methodIWantToReuse() {
Object1 obj1 = new Object(firstName, lastName);
Object2 obj2 = new Object(age,city);
Object3 obj3 = new Object(obj1, obj2);
Object4 obj4 = new Object(obj3);
// Passing in the objects created above as argument, which have the Parent instance variable data
return someRandomMethodHere(obj4);
}
public class ChildClass {
private static final String firstName = "Miley";
private static final String lastName = "Cyrus";
private static final int age = 27;
private static final String city = "Los Angeles";
public boolean methodIWantToReuse() {
// DOESN'T WORK CORRECTLY, because ends up using the instance variable data of PARENT class, but it
// needs to use CHILD class instance variable data
super.methodIWantToReuse();
}
【问题讨论】:
-
你的父类实例变量是私有的,所以你不能从子类更新它们。因此,您可以使用参数化方法或为实例变量创建受保护的 setter getter。在您的情况下,变量是最终的,因此您实际上甚至无法更新它们。所以从技术上讲,不可能在父类中使用子类变量。
-
使用
super.VarName -
@GauravJeswani 我可以删除“private”和“final”修饰符。
-
@AshishKamble 我想使用 CHILD 实例变量,而不是父变量。 super.VarName 只会调用父实例变量?
-
@ennth 我在下面添加了我的答案。您可以查看解决方案。
标签: java oop inheritance overriding