[swift-evolution] Replace the override keyword by 'extend' and 'replace' or add an annotation like @SuppressSuperCall
Vanderlei Martinelli
vmartinelli at alecrim.com
Mon Feb 15 18:53:36 CST 2016
+1 to @super :-)
On Mon, Feb 15, 2016 at 8:52 PM, Haravikk via swift-evolution <
swift-evolution at swift.org> wrote:
> This is an interesting idea, and fits well with the theme of preventing
> mistakes in Swift, but I think that the proposed solution isn’t flexible
> enough, as there are cases for inheritance patterns where extending doesn’t
> actually make sense, so having to specify an exception every time could
> quickly become annoying.
>
> I think the better solution is to instead allow super-classes to specify
> whether or not their method must be called when overridden/extended. For
> example:
>
> class View {
> @super(required) func viewDidLoad() { … }
> }
>
> class Button : View {
> override func viewDidLoad() { … }
> }
>
> class Widget : View {
> override func viewDidLoad() {
> super.viewDidLoad()
> …
> }
> }
>
> In this extension of your example Button will cause an error because it
> overrides viewDidLoad() but fails to call the parent’s method as required
> by the @super attribute. However, Widget compiles successfully because it
> follows the requirement.
>
> So the options for @super would be:
>
>
> - *required: *child-class must call parent implementation of this
> method.
> - *optional:* default behaviour, child can choose whether to call the
> parent’s method.
> - *denied:* child may not call parent’s method (useful if it makes
> assumptions that a child-class may not follow), but can still
> extend/override.
>
>
> I think this would be a more flexible solution to the problem, and put the
> decision in the hands of those writing classes designed for inheritance.
> I’m not 100% sure of whether to rename override to extend, I like extend
> better personally, but it probably doesn’t matter overall.
>
> On 15 Feb 2016, at 20:57, Florian Liefers via swift-evolution <
> swift-evolution at swift.org> wrote:
>
> Hi!
>
> I would like to suggest to replace the override keyword for functions by
> something like extend and replace or to add an annotation like
> @SuppressSuperCall (don’t know a good name for it).
> The reason for this is, that it might happen, that one forgets to call the
> super’s implementation in an overridden function or if one reads the code
> it might not be obvious why the super’s implementation is not called:
>
> class View {
> func viewDidLoad() {
> // does something
> }
> }
>
> class Button: View {
> override func viewDidLoad() {
> super.viewDidLoad() // <— this might be forgotten
> // do something other
> }
> }
>
> The compiler will accept if one overrides a superclass’s function but does
> not call the superclass’s implementation which is often ok. The developer
> should clearly state that he doesn’t want to call the superclass’s
> implementation, otherwise the compiler should throw an error.
>
> // Example for extending a function
> class Button: View {
> extend func viewDidLoad() {
> super.viewDidLoad()
> // do something
> }
>
> extend func viewDidAppear() {
> // do something
> } // <— the compiler should throw an error here.
> }
>
> // Example for replacing a function
> class Geometry {
> func volume() -> Double {
> return 0;
> }
> }
>
> class Cube: Geometry {
> var length: Double = 0.0
> replace func volume() -> Double {
> let v = length * length * length
> return v
> }
> }
>
> Cheers,
> Florian
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
>
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160215/c01ceb44/attachment.html>
More information about the swift-evolution
mailing list