[swift-evolution] Method dispatching issue with subclasses implementing Equatable protocol.
Joe Groff
jgroff at apple.com
Wed Jan 18 10:44:02 CST 2017
> On Jan 18, 2017, at 2:59 AM, Francisco Javier Fernández Toro via swift-evolution <swift-evolution at swift.org> wrote:
>
> Hi,
>
> I've found that when you have a class hierarchy which implements Equatable, if you want to have the != operator working as expected, you need to override it, it's not enough with ==.
>
> If you don't define you own subclass != operator, Swift compiler will use the super class to resolve that operation.
>
> Is there any reason for that?
The `equal(to:)` method inside `Subclass` is not a valid override of `Superclass` because its argument only accepts `Subclass` instances, but the parent method needs to work with all `Superclass` instances. If you write it as an override, it should work:
class Subclass: Superclass {
let bar: Int
init(foo: Int, bar: Int) {
self.bar = bar
super.init(foo: foo)
}
override func equal(to: Superclass) -> Bool {
if let toSub = to as? Subclass {
return bar == toSub.bar && super.equal(to: to)
}
return false
}
}
We should probably raise an error, or at least a warning, instead of silently accepting your code as an overload. Would you be able to file a bug on bugs.swift.org about that?
-Joe
More information about the swift-evolution
mailing list