我有个问题。它源于从超类中调用子类方法,但有一点曲折。任何见识将不胜感激。
例如,假设我有一个MultipleChoice
扩展抽象超类的子类Question
。该类MultipleChoice
有一个方法addChoice(String choice)
,同时Question
执行任何问题应该做的所有事情,例如显示问题提示,并检查正确的答案。
我想创建MultipleChoice
该引用的实例Question
,然后调用该addChoice(String choice)
方法。这样做的原因是因为我想创建一个问题列表,然后在其中放置不同类型的问题(例如,多项选择,对与错等)。
像这样的东西:
ArrayList<Question> list = new ArrayList();
list.add(new MultipleChoice()); //this is valid
list.get(0).addChoice("abc");
list.get(0).addChoice("xyz"); //etc
但是,这当然是编译错误,因为并非每个问题都是问题的多选类型。
我知道有两种解决方案。
((MultipleChoice)list.get(0)).addChoice("abc");
addChoice(String choice)
到超类中Question
,以便可以将其覆盖MultiplceChoice
。由于我将要访问list
很多次,因此选项1很好...很丑,而选项2似乎做得不好,尤其是因为它Question
是抽象的。
我怎样才能优雅地做到这一点?
将伪方法添加到将仅由一个子类使用的超类中不是一种好习惯。如果其他人(或将来的您)将在代码上工作并添加将从您的超类继承的新类型的问题,则会导致混淆和误解Question
。
您可以像这样将对象添加到列表中:
ArrayList<Question> list = new ArrayList<Question>();
MultipleChoice multipleChoiceQ1 = new MultipleChoice();
multipleChoiceQ1.addChoice("abc");
MultipleChoice multipleChoiceQ2 = new MultipleChoice();
multipleChoiceQ2.addChoice("xyz");
list.add(multipleChoiceQ1);
list.add(multipleChoiceQ2);
使用此方法,您可以将其他对象添加到列表中,这些对象是如下所示的子类Question
:
TrueAndFalse trueAndFalse1 = new TrueAndFalse();
//do something here
TrueAndFalse trueAndFalse2 = new TrueAndFalse();
//do something here
list.add(trueAndFalse1);
list.add(trueAndFalse2);
然后在访问列表时使用instanceof
来检查数据类型。例如:
for (Question question : list) {
if (question instanceof MultipleChoice) {
MultipleChoice multipleChoice = (MultipleChoice) question;
multipleChoice.doSomething();
} else if (question instanceof TrueAndFalse) {
TrueAndFalse trueAndFalse = (TrueAndFalse) question;
trueAndFalse.doSomethingElse();
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句