Swift算子与继承

Swift算子与继承,swift,Swift,我在继承类中重新定义了>操作符,但系统仍然调用父类的>。这是我的父母 类别: 下面是继承类: class Chapter: GenericModelClass { } func > (lhs: Chapter, rhs: Chapter) -> Bool { print("Use my > operator on chapter") return lhs.number > rhs.number } 但是,当我使用subElementArray中的Chap

我在继承类中重新定义了>操作符,但系统仍然调用父类的>。这是我的父母 类别:

下面是继承类:

class Chapter: GenericModelClass {
}
func > (lhs: Chapter, rhs: Chapter) -> Bool {
    print("Use my > operator on chapter")
    return lhs.number > rhs.number
}
但是,当我使用subElementArray中的Chapter对象调用orderSubElements函数时,调用的>是来自GenericModelClass的。所以在日志中我有:

在GenericModelClass上使用my>函数(实际类为第章)


您知道如何让orderSubElements使用正确的运算符吗?如果我在subElementArray数组中有章,我想为章调用>

操作符不会动态调度。编译器使用调用站点上的可用信息选择
的实现

您可以通过在
GenericModelClass
中定义一个方法来进行比较来解决这个问题

class GenericModelClass
{
    // ... other stuff ...

    func isGreaterThan(other: GenericModelClass) -> Bool
    {
        return self.uniqueID() > other.uniqueID()
    }
}
并在第二章中覆盖它

class Chapter
{
    // ... other stuff ...

    override func isGreaterThan(other: GenericModelClass) -> Bool
    {
        guard let otherChapter = other as? Chapter
        else
        {
            return super.isGreaterThan(other)
        }
        return self.number > other.number
    }
}
操作员变为

func > (lhs: GenericModelClass, rhs: GenericModelClass) -> Bool 
{
    return lhs.isGreaterThan(rhs)
}

这回答了所问的问题,但是有一点设计的味道,需要检查和转换参数的类型,这就是在一个数组中混合比较的两个概念并对其进行排序。您的模型可能需要更复杂一些,即
GenericModelClass
对象的排序概念需要理解不同类型的对象,并相应地进行排序。e、 g.将所有章节放在前言之后,但放在索引之前等。

注意,对于可比较的协议,您应该实现
)。
func > (lhs: GenericModelClass, rhs: GenericModelClass) -> Bool 
{
    return lhs.isGreaterThan(rhs)
}