【问题标题】:Java OOP Polymorphism / SubclassJava OOP 多态/子类
【发布时间】:2017-05-27 07:57:35
【问题描述】:

我在锻炼方面有些挣扎。我想在方法addQuestion 中保存question1question2。但我不知道如何访问f 并将其添加到可访问的内容中。在我的教科书中,他们告诉我们应该使用多态性来做到这一点。当我启动调试器时,我看到当q.addQuestion 被调用时,有一个属性f 包含我需要的字段。但是我怎样才能保存它们以备后用呢?我的第一个想法是我可以用 ArrayList 做到这一点,但我不能使用任何 Imports(这是教科书中的规则)。

可能我没有正确理解多态性。

public class something{
    public static void main(String[] args) {
        Quiz q = new Quiz(2);
        q.addQuestion(new question1("SomeText",5,157,5));
        q.addQuestion(new question2("SomeText",5,157,5,123));
        ...
    }
}

public class Quiz {
    int myNumQuestions;
    Quiz[] quizQuestion;

    Quiz(int numQuestions){
        this.myNumQuestions = numQuestions;
        quizQuestion = new Quiz[myNumQuestions];
    }

    public boolean addQuestion(Interface f){
        quizQuestion = new f(); //that does not work but how can I access the field from f?
}

问候。

编辑:

我稍微更改了我的公共课程Quiz,现在我可以分配f

MyInterfaceName[] = quizQuestion;

Quiz(int numQuestions){
    this.myNumQuestions = numQuestions;
    quizQuestion = new Quiz[myNumQuestions];
}

public boolean addQuestion(Interface f){
    quizQuestion[mycounter++] = f;
}

【问题讨论】:

  • 1) “接口 f” - 这应该是什么? 2)您添加了哪个原始骨架程序和哪个位?类 Quiz 看起来嵌套在 Array Quiz 中,这对我来说没有意义。所以简单来说,一个测验有很多问题,但问题不应该是更多的测验......?问题课在哪里?
  • 在您附加的代码中 - 您的代码和给出的代码是什么?
  • 显然不是最好的名字,Interface应该是“interface”类的名字,我有2个“question”类(question1和question2)->1个AbstractQuestion,接口由AbstractQuestion实现. public boolean addQuestion(Interface f) 在书中定义。给定类 somethign 和方法签名,如“boolean addQuestion(Interface f)”

标签: java oop polymorphism


【解决方案1】:

您的课堂测验包含一个用于Question 引用的数组。所以:Question 应该是 interface(其他类只是 实现);或者它可以是一个(抽象的)base class,它被你的 Q1、Q2、...类扩展。

所以将类型从“interface”更改为 Question 并将传入的对象放入您的数组中。您必须跟踪数组中的空闲槽。

换句话说:你希望你的Quiz 类像一个盒子一样工作;你可以把Question的东西放进那个盒子里。现在你只需要决定Question 是否应该是一个接口(没有任何特定的实现);或者如果类的层次结构更好。

就是这样。如需进一步阅读,请参阅here

【讨论】:

  • 感谢您的“进一步阅读”,您也让我离结果更近了一点!
  • 仅作记录:您不需要列表。也可以使用数组并手动“增长”它们。因此,已接受答案中的建议完全不正确。如果您觉得我的回答有帮助,请考虑在达到投票级别后对其进行投票。
  • 我建议使用 List 而不是数组...所以如果他创建一个 Quiz(10000000) 会导致 OOM 异常,因为所有数组空间都需要预先分配。我必须使用原始代码...我不是说它正确,但它可以工作。
  • 请后退一会儿。消化你得到的输入。您会看到作业背后的想法是最终没有解决方案。这是关于到达那里。问别人太快会妨碍你学习!试着自己找路!
  • @GhostCat - 你是老师?这个网站的伟大之处在于相互学习……确保您可以阅读网络上的所有内容。我不是说你做错了,但不要被束缚。赛亚。
【解决方案2】:
    public class Quiz<T> {

    T[] quizQuestion;
    private int i = 0; 
    Quiz(int numQuestions){
        quizQuestion = new T[myNumQuestions];
    }


    public boolean addQuestion(T f){
     quizQuestion[i++] = f;
    }
}

【讨论】:

  • 显然,你只分配了 2 个问题,所以如果你添加超过 2 个问题,那么你需要使用 List 来代替。
  • 好的,谢谢,你的问题让我更进一步,我改变了“Quiz[] quizQuestion;”到 InterfaceName[] quizQuestion,我现在可以分配“f”
  • 您的评论完全错误。 A)他明确表示他不能使用列表 B)当然你可以使用数组来存储未知数量的对象。你必须增加数组并复制周围的东西。当然这很乏味,但可能会这样做。
  • 我从不说这是不可能的 :) 给猫剥皮的方法不止一种。由于 OOM 异常,我建议不要使用数组。 “用最好的工具做最好的工作:)
  • 当说明告诉不要使用那个东西时,它并没有多大帮助。除此之外:只写代码而不做任何解释并不是一个很好的回答方式。尤其是当您在这里介绍另一个使用泛型的复杂主题时。它们在这里甚至没有多大意义。
【解决方案3】:

这将是我的方法...使用泛型,因此您的测验可以采用任何类或接口。

public class Quiz<T> {

            List<T> quizQuestion;
            Quiz(){
                quizQuestion = new ArrayList<T>;
            }

            public boolean addQuestion(T f){
             quizQuestion.add(f);
            }
        }

    class Question {}

    public void main(String[] args) {
      Quiz quiz = new Quiz<Question>();
      quiz.add(new Question());
    }

【讨论】:

  • 而且你永远不会给出两个答案!编辑第一个变得更好。
猜你喜欢
  • 1970-01-01
  • 2019-04-16
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多