将虚拟方法添加到超类中以便子类可以覆盖它是一种好习惯吗?

安德烈·凯波夫(Andrey Kaipov)

我有个问题。它源于从超类中调用子类方法,但有一点曲折。任何见识将不胜感激。

例如,假设我有一个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

但是,这当然是编译错误,因为并非每个问题都是问题的多选类型。

我知道有两种解决方案。

  1. 类型转换: ((MultipleChoice)list.get(0)).addChoice("abc");
  2. 将方法添加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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将伪方法添加到超类以使子类可以覆盖它是一种好习惯吗?

来自分类Dev

将前缀添加到所有CSS类是一种好习惯吗?

来自分类Dev

在Symfony2的实体类中添加额外的方法是一种好习惯吗?

来自分类Dev

将非成员函数放在类中是一种好习惯吗?

来自分类Dev

将axios响应错误存储在axios存储中并在组件中处理它是一种好习惯吗?

来自分类Dev

将静态方法放在Laravel模型中是一种好习惯吗?

来自分类Dev

将数据库连接对象添加到node.js中的process.env全局是否是一种好习惯?

来自分类Dev

从Realm的子类中调用[super defaultPropertyValues]是一种好习惯吗?

来自分类Dev

在Laravel Model类上添加自定义方法以在另一个表中插入记录是一种好习惯吗?

来自分类Dev

设置包装器类是一种好习惯吗?

来自分类Dev

在没有接口定义的类中添加公共方法是一种好习惯吗?我什么时候应该这样做?

来自分类Dev

在没有接口定义的类中添加公共方法是一种好习惯吗?我什么时候应该这样做?

来自分类Dev

是否可以将参数传递给Java构造函数方法?如果是这样,这是一种好习惯吗?

来自分类Dev

将指针用作类成员是一种好习惯吗?

来自分类Dev

如果变量重复并声明一次,将变量从方法中取出是一种好习惯吗?(C lang)

来自分类Dev

在ThreadPoolExecutor中设置allowCoreThreadTimeOut()是一种好习惯吗?

来自分类Dev

在$ rootScope中存储变量是一种好习惯吗?

来自分类Dev

在ReactJS中操作DOM是一种好习惯吗?

来自分类Dev

在dataProvider中定义期望是一种好习惯吗

来自分类Dev

在构造类中返回某些东西是一种好习惯吗?使用PHP oop

来自分类Dev

在python中创建嵌套类是一种好习惯吗?

来自分类Dev

在头文件中初始化类的成员变量是一种好习惯吗?

来自分类Dev

在Eclipse中为每个类创建单独的Java文件是一种好习惯吗?

来自分类Dev

将方法分组为更通用的方法是一种好习惯吗?

来自分类Dev

在javascript中在数组上添加属性是一种好习惯吗

来自分类Dev

在tsconfig.json排除字段中添加测试文件是一种好习惯吗?

来自分类Dev

有没有一种方法可以将样式添加到特定父项的选择器之后的任何子类中?

来自分类Dev

将include指令合并到一个文件中是一种好习惯吗

来自分类Dev

C:将静态函数原型放入实现文件中是一种好习惯吗?

Related 相关文章

  1. 1

    将伪方法添加到超类以使子类可以覆盖它是一种好习惯吗?

  2. 2

    将前缀添加到所有CSS类是一种好习惯吗?

  3. 3

    在Symfony2的实体类中添加额外的方法是一种好习惯吗?

  4. 4

    将非成员函数放在类中是一种好习惯吗?

  5. 5

    将axios响应错误存储在axios存储中并在组件中处理它是一种好习惯吗?

  6. 6

    将静态方法放在Laravel模型中是一种好习惯吗?

  7. 7

    将数据库连接对象添加到node.js中的process.env全局是否是一种好习惯?

  8. 8

    从Realm的子类中调用[super defaultPropertyValues]是一种好习惯吗?

  9. 9

    在Laravel Model类上添加自定义方法以在另一个表中插入记录是一种好习惯吗?

  10. 10

    设置包装器类是一种好习惯吗?

  11. 11

    在没有接口定义的类中添加公共方法是一种好习惯吗?我什么时候应该这样做?

  12. 12

    在没有接口定义的类中添加公共方法是一种好习惯吗?我什么时候应该这样做?

  13. 13

    是否可以将参数传递给Java构造函数方法?如果是这样,这是一种好习惯吗?

  14. 14

    将指针用作类成员是一种好习惯吗?

  15. 15

    如果变量重复并声明一次,将变量从方法中取出是一种好习惯吗?(C lang)

  16. 16

    在ThreadPoolExecutor中设置allowCoreThreadTimeOut()是一种好习惯吗?

  17. 17

    在$ rootScope中存储变量是一种好习惯吗?

  18. 18

    在ReactJS中操作DOM是一种好习惯吗?

  19. 19

    在dataProvider中定义期望是一种好习惯吗

  20. 20

    在构造类中返回某些东西是一种好习惯吗?使用PHP oop

  21. 21

    在python中创建嵌套类是一种好习惯吗?

  22. 22

    在头文件中初始化类的成员变量是一种好习惯吗?

  23. 23

    在Eclipse中为每个类创建单独的Java文件是一种好习惯吗?

  24. 24

    将方法分组为更通用的方法是一种好习惯吗?

  25. 25

    在javascript中在数组上添加属性是一种好习惯吗

  26. 26

    在tsconfig.json排除字段中添加测试文件是一种好习惯吗?

  27. 27

    有没有一种方法可以将样式添加到特定父项的选择器之后的任何子类中?

  28. 28

    将include指令合并到一个文件中是一种好习惯吗

  29. 29

    C:将静态函数原型放入实现文件中是一种好习惯吗?

热门标签

归档