> On Jun 29, 2016, at 4:05 PM, Matthew Johnson via swift-evolution 
> <swift-evolution@swift.org> wrote:
>> On Jun 29, 2016, at 5:56 PM, Mark Lacey via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>>> 
>>> On Jun 29, 2016, at 3:45 PM, Rod Brown via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>> 
>>> From my understanding, "Sealed" or whatever we will call it technically 
>>> provides no actual optimisations. We cannot assume the class is final 
>>> because something inside the module may have vended a subclass.
>> 
>> It can enable optimization when compiling with -whole-module-optimization 
>> since we know all the subclasses defined within the module. For any call 
>> site where the static type and all subclasses are sealed, we can limit the 
>> set of potential callees to only the functions defined in those types. 
>> Further, if the static type at the callsite has no subclasses, we can treat 
>> it like final and devirtualize the call.
> 
> There are other interesting things that you can do when you know a class 
> isn’t public inheritable.  For example, I am planning a proposal (after Swift 
> 3) for exhaustive pattern matching on classes that are not publicly 
> inheritable.  

Yes, there are a number of things in this category.  For example, there's a 
fair amount of pedantry around class initializers that we could significantly 
weaken if we're certain we know about all the subclasses.

John.

> 
>> 
>> Mark
>> 
>>> 
>>> The issue that "sealed" as a concept fills is that you stop people from 
>>> subclassing types that were never specifically designed for subclassing, 
>>> but allows the module to do some subclassing for its own needs because the 
>>> developer understands how the class works.
>>> 
>>> It also means a developer of the framework can retroactively apply "Final" 
>>> to the class if they've worked out it actually should be final and will 
>>> never be subclass. If the concept of Sealed did not exist, then a framework 
>>> could never finalise a class down the track - users of the framework may 
>>> have subclassed the type, and now the framework is hamstrung by its 
>>> previous "openness".
>>> 
>>> Should this be the default? In my opinion, yes.  Allowing subclassing to 
>>> other clients should be explicit. It will tie you down and limit you from 
>>> developing into the future. Allowing subclasses from other clients is a 
>>> promise for the life of your product, and cannot be reneged. On classes 
>>> that are not designed for subclassing, this is ill advised, and on classes 
>>> you wish to optimise, it's a permanent limitation.
>>> 
>>> While I fear the abuse framework vendors will exercise, by allowing clever 
>>> private hacks, and disallowing obj-c style workarounds, I think the safety 
>>> and longevity of this approach is far more important.
>>> 
>>> +1 to the concept. I agree "sealed" is not foot wording and can be improved.
>>> 
>>> - Rod Brown
>>> 
>>>> On 30 Jun. 2016, at 5:05 am, Michael Peternell via swift-evolution 
>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>> 
>>>> I'm still unhappy about this "sealed by default" proposal. That really 
>>>> looks like premature optimization to me. Instead there should be some 
>>>> `sealed` keyword. Maybe it should be called `applepublic` :-p Everyone 
>>>> will understand!
>>>> 
>>>> `sealed` classes should be a special optimization used by optimizing 
>>>> developers who ask for it. Don't make it an unwanted and un-asked-for 
>>>> default optimization. The people who care for optimization much will learn 
>>>> about `sealed` and be able to apply the concept in both cases. The people 
>>>> who don't care about performance will just be disappointed by the 
>>>> "implicitly sealed" behavior. And with this proposal, when I read 
>>>> `unsealed` I can never know: "did this developer intend me to be able to 
>>>> subclass this class? or did he just not want to restrict me 
>>>> unnecessarily?" The documenting aspect of `unsealed` is so small.
>>>> 
>>>> And `sealed` is just an optimization; IMHO the magic of static dispatch 
>>>> lies in final classes or final methods. Sealing everything by default just 
>>>> marks many classes and methods as implicitly final (because it can be 
>>>> proven that they are not subclassed). I just don't think that all these 
>>>> theoretical performance improvements are really worth the trouble in 
>>>> practice.
>>>> 
>>>> -Michael
>>>> 
>>>>> Am 29.06.2016 um 20:39 schrieb Vladimir.S via swift-evolution 
>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>>:
>>>>> 
>>>>> How about `public(extensible)` ?
>>>>> 
>>>>> On 29.06.2016 21:32, John McCall via swift-evolution wrote:
>>>>>>> On Jun 29, 2016, at 11:16 AM, Michael Peternell via swift-evolution 
>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>>>> Do you mean `public(unsealed)`? Because `internal(unsealed)` doesn't 
>>>>>>> really make sense. `internal` declarations are always sealed.
>>>>>> 
>>>>>> Right.
>>>>>> 
>>>>>> If "sealed" is the default behavior for public classes and methods — and 
>>>>>> I don't think the modifier is worth adding unless it's the default — 
>>>>>> then we need a way of "unsealing" classes and methods that's fairly 
>>>>>> pithy.  I don't think a parenthesized spelling is good enough for that.  
>>>>>> And we should try to make the positive form ("can be overridden") 
>>>>>> shorter than the negative ("cannot be overridden"), because the latter 
>>>>>> will not usually be written.
>>>>>> 
>>>>>> To me, the ideal spelling would be usable in place of "public".  If it 
>>>>>> does have to be stacked with "public", then I think it ought to be 
>>>>>> pretty short.
>>>>>> 
>>>>>> "communal"? :)
>>>>>> 
>>>>>> "open" doesn't carry quite the right meaning, and it would need to be 
>>>>>> paired with "public", I think.
>>>>>> 
>>>>>> John.
>>>>>> 
>>>>>> 
>>>>>>> 
>>>>>>> -Michael
>>>>>>> 
>>>>>>>> Am 29.06.2016 um 20:11 schrieb Xiaodi Wu via swift-evolution 
>>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>>:
>>>>>>>> 
>>>>>>>> Do we really need a new keyword? Since we already have syntax like 
>>>>>>>> `internal(set)` couldn't we do `internal(unsealed)`, etc.
>>>>>>>> 
>>>>>>>>> On Wed, Jun 29, 2016 at 12:21 PM, David Sweeris via swift-evolution 
>>>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>>>>>> On Jun 29, 2016, at 12:15 PM, Michael Peternell 
>>>>>>>>> <michael.petern...@gmx.at <mailto:michael.petern...@gmx.at>> wrote:
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>>> Am 29.06.2016 um 15:54 schrieb David Sweeris via swift-evolution 
>>>>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>>:
>>>>>>>>>> 
>>>>>>>>>> +1 for the concept of a "sealed” class.
>>>>>>>>>> -1 for making it default.
>>>>>>>>> 
>>>>>>>>> Aren't sealed classes already implemented? I think the keyword is 
>>>>>>>>> `final`..
>>>>>>>>> So there is nothing left to do :)
>>>>>>>> 
>>>>>>>> No, `final` doesn’t allow for any subclassing, but `sealed` allows for 
>>>>>>>> subclassing within your module (where you can presumably write more 
>>>>>>>> efficient code based on knowledge of each subclass).
>>>>>>>> 
>>>>>>>> - Dave Sweeris
>>>>>>>> _______________________________________________
>>>>>>>> swift-evolution mailing list
>>>>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>>>> 
>>>>>>>> _______________________________________________
>>>>>>>> swift-evolution mailing list
>>>>>>>> swift-evolution@swift.org
>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>>> 
>>>>>>> _______________________________________________
>>>>>>> swift-evolution mailing list
>>>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>> 
>>>>>> _______________________________________________
>>>>>> swift-evolution mailing list
>>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>> 
>>>>> _______________________________________________
>>>>> swift-evolution mailing list
>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to