<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">
I’d agree with the proposition of eliminating open.
<div class="">It does look as an additional layer of complexity for a use case that is imho not so common.</div>
<div class=""><br class="">
<div>
<blockquote type="cite" class="">
<div class="">On 20 Feb 2017, at 18:07, Vladimir.S via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div>
<br class="Apple-interchange-newline">
<div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">On
 20.02.2017 19:47, Joanna Carter via swift-evolution wrote:</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">
OK, here comes the girl with the big wooden spoon to stir things up a bit ;-)<br class="">
<br class="">
When it comes to visibilities on classes, why, oh why do we have public vs open *as well as*<br class="">
the option of marking stuff as final?<br class="">
<br class="">
Surely, outside the module boundary :<br class="">
<br class="">
1. public is the same as final ; i.e. you can see it but you can't derive from/override it<br class="">
<br class="">
2. open is the same as public without final ; you can see it and derive from/override it<br class="">
<br class="">
Inside the module boundary, there is essentially no difference between public and open.<br class="">
<br class="">
In fact, open/public is a conflation of concerns.<br class="">
<br class="">
Both allow public visibility but, mixed in with that is restriction of inheritance. Surely public is good enough for visibility and final is good enough for inheritance restriction?<br class="">
<br class="">
////////////////<br class="">
// Module1 file<br class="">
<br class="">
// MARK: base classes<br class="">
<br class="">
open class OpenClass<br class="">
{<br class="">
&nbsp;open func test() { }<br class="">
}<br class="">
<br class="">
public class PublicClass<br class="">
{<br class="">
&nbsp;public func test() { }<br class="">
<br class="">
&nbsp;public final func finalTest() { }<br class="">
}<br class="">
<br class="">
public final class FinalPublicClass<br class="">
{<br class="">
&nbsp;public final func test() { }<br class="">
}<br class="">
<br class="">
// MARK: derived internal classes<br class="">
<br class="">
class FrameworkDerivedPublicClass : PublicClass<br class="">
{<br class="">
&nbsp;override func test() { }<br class="">
<br class="">
&nbsp;override func finalTest() { } // error : instance method overrides a 'final' instance method<br class="">
}<br class="">
<br class="">
class FrameworkDerivedFinalPublicClass : FinalPublicClass // error : inheritance from a final class<br class="">
{<br class="">
&nbsp;override func test() { } // error : instance method overrides a 'final' instance method<br class="">
}<br class="">
///////////////<br class="">
<br class="">
///////////////<br class="">
// Module2 file<br class="">
<br class="">
class OpenSubclass : OpenClass<br class="">
{<br class="">
&nbsp;override func test() { }<br class="">
}<br class="">
<br class="">
class PublicSubclass : PublicClass // error : cannot inherit from non-open class 'PublicClass' outside of its defining module<br class="">
{<br class="">
&nbsp;override func test() { } // error : overriding non-open instance method outside of its defining module<br class="">
<br class="">
&nbsp;override func finalTest() { } // error : method does not override any method from its superclass<br class="">
}<br class="">
<br class="">
class FinalPublicSubclass : FinalPublicClass // error : cannot inherit from non-open class 'FinalPublicClass' outside of its defining module<br class="">
{<br class="">
&nbsp;override func test() { } // error : instance method overrides a 'final' instance method<br class="">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// error : overriding non-open instance method outside of its defining module<br class="">
}<br class="">
////////////////<br class="">
<br class="">
In fact, the test() method in FinalPublicSubclass gives two errors one of which is the same as when declared in FrameworkDerivedFinalPublicClass.<br class="">
<br class="">
If final is good enough for inside the module boundary, and the same &quot;overriding final method&quot; error appears in both places, do we really need this added complexity?<br class="">
<br class="">
Surely, if we take public as meaning no inheritance control anywhere :<br class="">
<br class="">
public class BaseClass<br class="">
{<br class="">
&nbsp;public func test() { }<br class="">
<br class="">
&nbsp;public final func finalTest() { }<br class="">
}<br class="">
<br class="">
And then, either in or out of the module :<br class="">
<br class="">
class DerivedClass : BaseClass<br class="">
{<br class="">
&nbsp;override func test() { }<br class="">
<br class="">
&nbsp;override func finalTest() { } // error : instance method overrides a 'final' instance method<br class="">
}<br class="">
<br class="">
Or, if BaseClass were marked as final, then inheritance of the whole class is prohibited.<br class="">
<br class="">
So, I am proposing a reduction in keywords from open, public and final, to just public and final.<br class="">
</blockquote>
<br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">With
 'public' we can't have subtypes outside of the module, but can have subtypes inside the module. With 'final' you can't have subtype even inside module.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">That
 was the main idea, that your module knows all the possible subtypes of some type.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">
<br class="">
--<br class="">
Joanna Carter<br class="">
Carter Consulting<br class="">
<br class="">
_______________________________________________<br class="">
swift-evolution mailing list<br class="">
<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="">
<br class="">
</blockquote>
<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">_______________________________________________</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">swift-evolution
 mailing list</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<a href="mailto:swift-evolution@swift.org" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">swift-evolution@swift.org</a><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div>
</blockquote>
</div>
<br class="">
</div>
</body>
</html>