【问题标题】:Pass variable to one subclass将变量传递给一个子类
【发布时间】:2016-06-07 00:13:57
【问题描述】:

我是一名非程序员,很少接触编码,但我想修改现有的代码库。我已经大大简化了我在下面使用的代码。如果我可以提供任何进一步的信息,或者这根本没有意义,请告诉我!词汇很难。 :)

在 ClassA 中,我正在实例化 ClassB 的子类。我要进行的更改需要一个新变量“myVar”(在 ClassA 中设置)可用于子类 ClassC 但不能用于子类 ClassD。使该变量可用于 ClassC 的最合适的方法是什么?

A 类:

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();    
        }
    }
}

B 类:

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

C类:

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

D 类:

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

【问题讨论】:

  • 声明字段私有 - 私有字段不被继承
  • @MaciejCygan 但是 ClassC 将如何访问它?
  • 为什么不把myVar传递给ClassC的构造函数?
  • @DrewKennedy 是的,是的...... :(,Shmosel 的实际建议并不是一个坏主意。

标签: java


【解决方案1】:

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

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);
    }
}

【讨论】:

    【解决方案2】:

    首先,让你的变量 myVar 在类 A 中受保护。 将您的 A、B、C 类放在同一个包中。 将你的 D 类放在不同的包中。

    【讨论】:

    • 给这个答案 -1 的人不懂 OOP。
    • 嗯,你的建议并不正确。你不知道 OP 程序结构,所以你不能告诉他像那样移动东西。还有更多“适当”的方式来解决 OP 问题——比如 Shmosel 提供的解决方案
    • 通过构造函数传递该变量可以在类中访问任何变量,在这种情况下,它不是特定变量 myVar 的特定解决方案。同样,如果需要在 C 类中以相同的方式访问其他几种类型的变量,则需要定义多个构造函数,这也不是一个好主意。我认为从变量范围的角度来考虑是件好事。
    • 你不需要多个构造函数——你可以有一个带有多个变量的构造函数,但这又是有争议的,并且超出了 OP 的范围。他的问题是关于一个具体的例子,他正在寻找一个具体的答案。
    • 是的,我 100% 同意你关于“具有多个变量的单个构造函数,这是值得商榷的”。这就是为什么我建议那样做。事实上,我们没有人知道你之前所说的这段代码的完美 OP 结构,人们正在从不同的想法中回答。 -1 不是预期的。 :-)
    猜你喜欢
    • 2011-03-15
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多