当前位置: 首页 > 知识库问答 >
问题:

类为返回类型

戚兴邦
2023-03-14

我有一个任务,我们要创造一个石头,纸,剪刀的游戏。它指定我们必须创建一个抽象的“工具”类,其中有三个子类:“ToolRock”、“ToolPaper”、“ToolScissors”。抽象类应该有一个“+getFeagnet():tool”函数(用斜体写成)。

我的假设是做一个像这样的抽象函数:

public abstract Tool getWeakness();

RockTool类被指定为具有函数“+get弱点():tool”(不是用斜体写的),我的想法是创建一个覆盖父类的函数:

@Override public ToolPaper getWeakness() { return null; }

这个函数要回归什么才能做到这一点呢?我不能简单地“返回工具纸;”?那么,我如何创建一个函数,它返回工具的弱子类,而不返回字符串呢?

共有2个答案

夏侯朝斑
2023-03-14

Public ToolPaper GetFactony不是有效的重写,因为您已更改了签名。

您需要返回工具的实例,而不是您拥有的的实例3(您不能实例化抽象类)

所以,你应该

public class ToolPaper extends Tool {
    public ToolPaper() {
        super("paper");
    } 

    @Override
    public Tool getWeakness() { return new ToolScissors(); }
}

如果您想避免为每个虚弱调用初始化新对象,也可以考虑使用单例...否则,如果在任何时候比较类的相等性,则需要实现equals方法

楚丰羽
2023-03-14

在Java,类是第一类对象,因此可以像任何其他对象一样返回。

您将希望使用泛型来确保不使用错误类型的类。方法签名可以是:

public abstract class Tool {
    public abstract Class<? extends Tool> getWeakness();
}

您的实现将是

public class Rock extends Tool {
    public Class<? extends Tool> getWeakness() {
        return Paper.class;
    }
}

编辑:正如其他人提到的,设计表明应该返回工具实例,而不是。虽然一个类可以返回它弱的类的实例(最好是静态的),但这将是一个糟糕的设计。如果UML是您自己的,我建议更改签名以指示将返回class

 类似资料:
  • 我正试图从使用observable转换下面的observable代码。使用可管道操作符创建到。 我已经尝试了下面的方法,但是我得到了一个转换错误,无法转换可观察的类型。看不见的。如有任何帮助,我们将不胜感激。

  • 问题内容: 在python 3中,我可以设置参数并返回类型注释。例: 问题是我无法使用当前类(图形)的返回类型进行注释,该类型尚未定义。例: 这段代码有错误 这些注释对于记录文档以及允许IDE识别参数和返回类型都非常有用=>启用自动完成功能 UPD:所以我想到的是这是不可能的,或者需要一些我不喜欢的技巧,所以我决定使用 可以理解的文档,尽管这违反了规则。缺点是它不适用于IDE自动完成功能。 问题答

  • 如果我有以下代码 首先,这甚至是可能的,因为它编译得很好。但是我不能使用中的方法执行操作: makeCan是否不同时返回Can和PromotionalCan?如果是这样,当返回PromotionalCan时,如何对变量进行操作?谢谢 编辑:PromotionalCan继承自Can,第二种方法是在PromotionalCan中

  • 现在我学习Java已经有一段时间了,但有一个概念我很难理解。我习惯了这样的方法 我知道上面的方法会返回一个整数或字符串,无论你想要什么数据类型 现在我在问自己,上述方法的回报类型到底是什么。我如何使用返回的东西做其他事情? 我还看到人们将对象作为这样的参数传递给方法 这又是怎么回事?在什么情况下,上述“风格”是必要的,需要避免什么陷阱? 使用对象而不是整数之类的值让我感到困惑。

  • 我想写一个函数返回一个数组,其所有子数组的长度必须为2。例如,返回将是。 我定义: (1); 和 我觉得(1)太复杂了。有更简单的吗?

  • 假设我已经包装了我的C类和,并且可以通过SWIG生成的模块从Python访问它们: 在Python中,我创建了面向用户的类,它是一个浅层代理,主要添加docstring,并允许IDE对参数名称进行制表符补全: 问题在于,返回类型为,它没有docstring,也不显示参数名称(swig将所有参数公开为)。相反,我希望它提供我自己的浅代理