[swift-evolution] Proposal: Universal dynamic dispatch for method calls

Kevin Ballard kevin at sb.org
Wed Dec 9 15:13:56 CST 2015


That is nice, but if someone writes a method that's generic over <T: P> then your "override" won't get called. Seems like it's better to structure it like

protocol P {    func f() } extension P {    /// Default implementation
for `f`. Calls through to `_f()`.    func f() { _f() }    /// Helper
that provides the base functionality for `f`.    func _f() { ... } }
struct S {    func f() {        ...        _f()    } }

This way you can write code that's generic over <T: P> (or that takes a
P object directly) and it will still call the overrides.

-Kevin Ballard

On Wed, Dec 9, 2015, at 11:01 AM, Gwendal Roué wrote:
>
>> Le 9 déc. 2015 à 19:52, Kevin Ballard via swift-evolution <swift-
>> evolution at swift.org> a écrit :
>>
>> b) methods defined in protocol extensions by definition can't be
>>    overridden already,
>
> Methods defined in protocol extension actually can, sort of, be
> overridden, and this is very useful:
>
> protocol P { }    extension P {        func f() { … }    }    struct S
> {        func f() {            ...            (self as P).f()
> …        }    }
>
> I know only one use case for this technique, in the groue/GRDB.swift
> SQLite wrapper:
>
> In this library, a DatabasePersistable protocol provides basic CRUD
> operations, and a Record class adopts this protocol and "overrides"
> with the technique above the protocol methods with extra features
> provided by the class (especially change tracking).
>
> The benefits of this architecture are:
>
> - You can subclass use the full-featured Record base class, and get
>   CRUD + change tracking for free.
> - The Record subclasses can override the CRUD methods, and add custom
>   code (validation, for example).
> - You can have a custom struct adopt DatabasePersistable, and get CRUD
>   for free.
> - The custom structs that can also "override" the CRUD methods, and
>   add custom code (validation, for example).
>
> This is, in my opinion, a very valid use case for this "overriding".
> Gwendal Roué
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20151209/422aa3b6/attachment.html>


More information about the swift-evolution mailing list