当前位置: 首页 > 面试题库 >

扩展中的快速覆盖功能

郎星汉
2023-03-14
问题内容

如果我上课:

class Spaceship<FuelType> {
    function prepareForLiftoff() throws {
        //Start the countdown!
    }
}

我最初以为我可以prepareForLiftoff通过添加扩展名来覆盖子类而无需子类化:

extension Spaceship where FuelType: CollectionType {
    func prepareForLiftoff() throws {}
}

该代码不会编译,但错误说明invalid redeclaration了该函数,这很有意义。

我的问题是: 是否仍要重写特定类的功能?换句话说,在某些情况下,例如上面的示例中,我可以替换功能吗FuelType: CollectionType?如果没有,是否有其他解决方法或方法来实现该行为(可能声明了另一个协议,idk)

现在,我考虑得更多了,我不得不说这是不可能的,因为是什么阻止某人重写任何标准库函数?


问题答案:

从文档中:

扩展可以为类型添加新功能,但不能覆盖现有功能。

该文档仔细,准确地列出了允许扩展的功能。

关于你的问题:

无论如何有重写特定类的功能

是的,这称为子类化。



 类似资料:
  • 问题内容: 我正在尝试使用Swift协议扩展,却发现这种行为令人困惑。您能帮我得到我想要的结果吗? 请参阅代码最后4行的注释。(如果需要,可以将其复制粘贴到Xcode7游乐场)。谢谢!! 问题答案: 简短的答案是协议扩展不执行类多态性。这是有一定道理的,因为协议可以被结构或枚举采用,并且因为我们不希望仅在没有必要的地方采用协议来引入动态调度。 因此,在中,实例变量(可能更准确地写为)并不意味着您认

  • 问题内容: 我的二传手迅速遇到了一个奇怪的问题。我有带有代码的PlayingCard类: 我在另一个类中使用此init()方法,实现如下所示: 当代码看起来像上面的代码时,我在一行中遇到了一个错误: 但是,当我从 等级 和 西服 属性中删除setter和getter时,它工作正常,没有出现错误。 您能解释一下为什么出现此 EXC_BAD_ACCESS 错误吗? 谢谢您的帮助 问题答案: 通过写这个

  • 问题内容: 我知道这个答案已经以其他形式发布在这里,但是我想了解更多有关迅速覆盖实例变量的信息。 假设我有这段代码 好。从我读到的内容来看,常量需要覆盖前缀。其他答案说我应该声明setter和getter?为什么?我真的不在乎这两个。我只需要替换值即可。我真的不能使用重写,因为我是从UIView继承的,这可能很危险(我认为)。 任何建议都欢迎。 问题答案: 如您所说,您不能简单地在子类中重新定义常

  • 我正在尝试将的接口扩展为: 但我得到了以下错误: 没有与此调用匹配的重载。重载1/3'(路径:PathParams,…处理程序:RequestHandler

  • 问题内容: 如果要覆盖django中应用程序随附的模板(在app / templates / app /中),请在另一个目录中创建相同名称的模板,模板加载器会在应用程序的模板目录之前检查该模板。如果您只想覆盖模板的某些块,则还必须复制整个模板广告,更改该块,这实际上不是很干。 有人知道一种方法来覆盖原始模板,同时扩展它,以便您只需要覆盖要更改的特定块吗?(这样做是在不更改模板名称的情况下进行的,因

  • 问题内容: Swift提供了编写扩展的功能。我做了很多事情,以使我的代码更易于阅读。不知道它们是否无害。我想知道,由于性能原因,仅省略扩展会更好吗? 问题答案: Apple鼓励使用扩展名。你可以阅读更多关于他们的雨燕文档上这里。