首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在类层次结构中正确地实现平等协议?

如何在类层次结构中正确地实现平等协议?
EN

Stack Overflow用户
提问于 2016-10-07 05:08:10
回答 4查看 10.6K关注 0票数 16

我试图在基类中实现==操作符(来自Equatable),在Swift 3中实现它的子类。所有的类都只在Swift中使用,所以我不想涉及NSObjectNSCopying协议。

我从一个基类和一个子类开始:

代码语言:javascript
复制
class Base {
    var x : Int
}

class Subclass : Base {
    var y : String
}

现在,我想将Equatable==运算符添加到Base中。看起来很简单。从文档中复制==操作符签名:

代码语言:javascript
复制
class Base : Equatable {
    var x : Int

    static func == (lhs: Base, rhs: Base) -> Bool {
        return lhs.x == rhs.x
    }
}

到目前一切尚好。下面是子类:

代码语言:javascript
复制
class Subclass : Base {
    static override func == (lhs: Base, rhs: Base) -> Bool {
        return true
    }
}

但这会导致一个错误:

运算符函数覆盖“最终”运算符函数。

好的。经过一些研究(还在学习Swift 3),我了解到可以用static替换class,以指示可以重写类型方法。

因此,我尝试将static更改为class in Base

代码语言:javascript
复制
class Base : Equatable {
    var x : Int

    class func == (lhs: Base, rhs: Base) -> Bool {
        return lhs.x == rhs.x
    }
}

但这导致了一个新的错误:

非最终类'Base‘中声明的运算符'==’必须是'final‘。

呃。这比应该要复杂得多。

如何在基类和子类中正确地实现Equatable协议和==操作符?

EN

Stack Overflow用户

发布于 2018-05-24 01:32:49

rmaddy's answer之后,我提出了一种测试等式的防护方法:

Base.swift

代码语言:javascript
复制
static func ==(lhs: Base, rhs: Base) -> Bool {
    // ensure class properties match
    guard lhs.x == rhs.x else {
        return false
    }

    return true

}

Subclass.swift

代码语言:javascript
复制
static func ==(lhs: Subclass, rhs: Subclass) -> Bool {
    // ensure base class properties match
    guard lhs as Base == rhs as Base else {
        return false
    }

    // ensure class properties match
    guard lhs.y == rhs.y else {
        return false
    }

    return true
}
代码语言:javascript
复制
票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39909805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档