[swift-evolution] Protected access level / multiple class/struct/protocol APIs

Joe Groff jgroff at apple.com
Tue Mar 29 20:28:40 CDT 2016


> On Mar 29, 2016, at 6:18 PM, Joe Groff via swift-evolution <swift-evolution at swift.org> wrote:
> 
>> 
>> On Mar 29, 2016, at 6:04 PM, Dietmar Planitzer via swift-evolution <swift-evolution at swift.org> wrote:
>> 
>> Well that would be true if we assume that protected would work that way. Considering that this:
>> 
>> private class A { … }
>> 
>> public class B : A { … }
>> 
>> is not allowed in Swift, I don’t see a good reason why an override of a protected method should be allowed to upgrade the access level to public. On the other hand this:
>> 
>> public class A {
>>   private func foo() {
>>       print("A")
>>   }
>> }
>> 
>> public class B : A {
>>   public override func foo() {
>>       print(“B”)
>>   }
>> }
>> 
>> happens to actually work if both A and B are defined in the same file - which is rather unexpected. I would have expected that Swift would in general not allow overrides to upgrade the inherited access level. Eg exposing semantics which is embodied in a private or protected method should require a conscisous design decision and should require the designer to introduce a separate method name which is part of the public API. The public method can then call through to the private or protected method as needed.
> 
> That would still be a toothless restriction, since a subclass could define a new method:
> 
> public class B : A {
>   public func foo_() {
>       super.foo()
>   }
> }
> 
> From an interface perspective, there's no difference between a subclass defining a new method or overriding a method that happens to be private to the base class.

Extensions further dilute the enforceability of "protected", since anyone would be able to use an extension to dump methods into a class's namespace and access its supposedly-protected bits.

-Joe


More information about the swift-evolution mailing list