将变量传递给一个子类

3
我是一名非程序员,对编程只有很少的经验,但我想修改一个现有的代码库。我已经大大简化了我正在处理的代码。如果需要更多的信息或者这一切都没有意义,请告诉我!术语很难理解。 :)
在ClassA中,我实例化了ClassB的一个子类。我想要进行的更改需要在ClassC子类中可用一个新的变量"myVar"(在ClassA中设置),但不可用于ClassD子类。如何最合适地将该变量提供给ClassC?
ClassA:
public class ClassA {
    private String myVar = "hi";
    private String myStuff = "bye";
    private int myOption = 1;

    private String getMyClass(String myStuff) throws Exception {
        final MyClassChoice myClass = getMyClassChoice(myOption);
        return myClass.getResponse(myStuff);
    }

    private MyClassChoice getMyClassChoice(myOption) {
        switch(myOption) {
            case 1:
                return new ClassC();
            case 2:
                return new ClassD();    
        }
    }
}

ClassB:

public class ClassB {
    public abstract String getResponse(String myStuff) throws IOException;
}

ClassC:

public class ClassC extends ClassB {
    // do stuff with myStuff
    // do stuff with myVar
}

ClassD:

public class ClassD extends ClassB {
    // do stuff with myStuff
}

声明字段为私有 - 私有字段不会被继承。 - Maciej Cygan
@MaciejCygan 但是那么ClassC如何获得它的访问权限呢? - Drew Kennedy
为什么不将 myVar 传递到 ClassC 的构造函数中? - shmosel
@DrewKennedy 是啊,真的... :(,Shmosel实际建议的不是一个坏主意。 - Maciej Cygan
2个回答

3

当您实例化对象并将其保存在实例变量中时,可以将其传递给构造函数中,

public class ClassA {
// ...
    private MyClassChoice getMyClassChoice(myOption) {
        switch(myOption) {
            case 1:
                return new ClassC(myVar);
            case 2:
                return new ClassD();    
        }
    }
}

public final class ClassC extends ClassB {

    private String myVar;

    // constructor:
    public ClassC(String myVar) {
        this.myVar = myVar;
    }

    // do stuff with myStuff
    // do stuff with myVar
    private void doStuff() {
        System.out.println(myVar);
    }
}

或者在使用该方法时将其传递给它,
public final class ClassA {
// ...
    public void someMethodUsingClassCDoStuff() {
        myClass.doStuff(myVar);
    }
}

public final class ClassC extends ClassB {

    // do stuff with myStuff
    // do stuff with myVar
    public void doStuff(String myVar) {
        System.out.println(myVar);
    }
}

-1
首先,在A类中将变量myVar设置为protected。 将A、B、C类放在同一个包中。 将D类放在另一个包中。

给这个答案打了-1的人不理解面向对象编程。 - Mahbub Rahman
1
你所建议的并不正确。你不知道OP程序的结构,所以不能随意告诉他移动东西。此外,还有更“合适”的解决OP问题的方法——就像Shmosel提供的解决方案一样。 - Maciej Cygan
任何变量都可以通过将该变量通过构造函数传递来在类中访问,这不是特定变量myVar的解决方案。同样,如果需要以相同方式访问类C中的其他几种类型的变量,则需要定义多个构造函数,这也不是一个好主意。我认为从变量作用域的角度考虑会更好。 - Mahbub Rahman
你不需要多个构造函数 - 你可以有一个带有多个变量的单个构造函数,但这又是有争议的,并且超出了OP关心的范围。他的问题涉及特定的示例,他正在寻找特定的答案。 - Maciej Cygan
是的,我完全同意你关于“单个构造函数具有多个变量并且这是有争议的”的观点。这就是为什么我建议那种方式。实际上,我们都不知道这段代码的完美OP结构,正如你之前所说,人们从不同的思维方式回答问题。-1并不是预期的结果。 :-) - Mahbub Rahman
讨论的根源也许在于问题本身:它是含糊不清的。传递值和使变量可用并不是同一件事情。我更喜欢传递值而不是打破封装,即使仅限于同一包中的类。我非常喜欢这样做,以至于我不能记得除了抽象类之外何时使用protected。另外,如果您想将myVar设置为包私有,则可以通过不使用任何访问修饰符来实现默认设置。protected使其对子类可访问。https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html - Arjan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接