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)
}