[swift-evolution] [Idea] Extend "required" to methods other than init()
Howard Lovatt
howard.lovatt at gmail.com
Wed Jan 20 20:20:11 CST 2016
Adding protected access and abstract methods and classes might be easier,
since then you could do:
/* abstract */ class Base {
/* protected abstract */ func methodToBeOverridden() -> String {
fatalError("Abstract") }
final func controlsWhenOverrideIsCalled() -> String{
var s = "In 'super' before override call.\n"
s += methodToBeOverridden()
return s + ".\nIn 'super' after override call."
}
}
class Derived: Base {
/* protected */ override func methodToBeOverridden() -> String {
return "In override"
}
}
let d = Derived()
d.controlsWhenOverrideIsCalled()
Which results in:
In 'super' before override call.
In override.
In 'super' after override call.
Calls to super could then be eliminated from the language!
On 21 January 2016 at 11:53, Jesse Squires <jesse.d.squires at gmail.com>
wrote:
> Thanks Matthew and Howard! A lot of good points there.
>
> There are certainly a few more possible semantics for overrides than I was
> initially thinking. It’s not clear to me if the language should support
> each use case or not. Doing so seems to add unnecessary complexity for
> (potentially) little gain.
>
> I can’t say for sure, but my guess is that the *most common* scenario is:
> "if a method is overridden, it must call super first". This would also make
> automatically synthesizing the call to super simpler, which I think is a
> great idea. Clients then have less of a burden when subclassing.
> However, as noted, non-void returns complicate this. Also, I agree that
> re-purposing `required` could be confusing. I’m open to ideas for an
> alternative keyword.
>
> Again, a lot of good ideas/feedback. I’m actually not sure where this
> leaves us. :) Accounting for all of the possible semantics seems too
> complex and burdensome, though I think our current state is insufficient.
> And perhaps accounting for only the simplest scenario, "if a method is
> overridden, it must call super first", would only further highlight the
> lack of ability to express the other possible semantics.
>
> ¯\_(ツ)_/¯ I’d love to hear if anyone else has ideas or shares these
> concerns!
>
> Jesse
>
>
> > On Jan 18, 2016, at 11:34 AM, Howard Lovatt via swift-evolution <
> swift-evolution at swift.org> wrote:
> >
> >>>
> >>> Are there other languages worth investigating which have the requires
> super first/last semantics you note?
> >>
> >> I don’t know of any languages that support this. It is not the most
> common semantic, but when it occurs it seems important enough that it would
> be better if it could be specified in the language itself and enforced
> rather than left to documentation.
> >
> > BETA has this ability, but it worked rather differently than modern OO
> languages (which work more like its predecessor Simula). In BETA you can
> only ever call the top most method, it can then optionally call the
> immediately overriding method. The syntax BETA uses is `inner(<args>)`.
> Probably easier with examples (in BETArised Swift):
> >
> > class Base {
> > func finalM() { print("finalM") }
> > func mustOverrideM() {
> > print("beforeInner")
> > inner()
> > print("afterInner")
> > }
> > }
> >
> > class Derived: Base {
> > func mustOverrideM() {
> > print("inInner")
> > }
> > }
> >
> > Methods `finalM` and `Derived.mustOverrideM` are automatically final
> because they do not call inner.
> >
> > You can't make an instance of `Base` because method `Base.mustOverrideM`
> needs to be overridden, i.e. `Base` is automatically abstract.
> >
> > If you:
> >
> > let d = Derived()
> > d.mustBeOverriddenM()
> >
> > Then it prints:
> >
> > beforeInner
> > inInner
> > afterInner
> >
> > _______________________________________________
> > swift-evolution mailing list
> > swift-evolution at swift.org
> > https://lists.swift.org/mailman/listinfo/swift-evolution
>
>
--
-- Howard.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160121/79568dd3/attachment.html>
More information about the swift-evolution
mailing list