[swift-evolution] [swift-evolution-announce] [Review #3] SE-0117: Allow distinguishing between public access and public overridability

Vladimir.S svabox at gmail.com
Fri Jul 22 08:51:55 CDT 2016

On 22.07.2016 11:15, Dave Abrahams via swift-evolution wrote:
>> IMO, the safety of API contracts is secondary. This is about safety of
>> implementation - my code is possibly not "resilient" enough (to to
>> speak) to handle overriding arbitrary public members.
> I wrote that subclassability is not an important element of safety
> **independent of overriding**.  If you don't allow any overriding,
> your code is always “resilient” enough to handle subclassing.

I believe in this case the #2 approach, as formulated in proposal, just 
can't work - base class of public class can have(and can add) `open` 
methods/props, so for the author of such public class it is hard to know 
what other methods (other than explicitly marked by him/her as `open`) 
would be overridden.

So, seems like for #2 approach the proposal should be changed to not 
implicitly open inherited `open` methords/props. Author of public class in 
this case must explicitly mark as `open` each method/prop one wants to 
export opened.

Then, in this case, we have a problem with *inherited* methods/props that 
author *want* to open. In this case to remove boilerplate like 'public open 
func f() { super.f()}', I don't see another way than adding new concept of 
re-introducing of inherited method without its body :

public class B : A {
   public open *reintroduce* var property  // without type/details
   public open *reintroduce* func foo()  // without body

   public open override func bar()
      //some code
      //some code

   public open func newFunc() {...}
   public func sealedFunc() {...}

(`reintroduce` as fast example of possible keyword for implementation of 
such feature)

Am I missing something?

More information about the swift-evolution mailing list