[swift-evolution] abstract keyWord proposal
Tal Atlas
me at tal.by
Fri Dec 4 07:36:33 CST 2015
I don't think there'd be much confusion with allowing protocol extensions
to contain stored types but I could easily see that being very difficult to
implement.
On Fri, Dec 4, 2015 at 4:24 AM David Scrève <david.screve at dlta-studio.com>
wrote:
> Yes,
>
> I agree with you that abstract might be attached to protocol family of
> feature…but protocol already manage the ‘abstract’ feature if you don’t
> consider the value storage issue.
>
> Actually, there 2 ways to add this feature :
>
> 1 - Protocol way : We need to add value storage to protocol
> 2 - class way : We need to add abstract for method/properties
>
> The question is : Is adding value storage to protocol is a good thing ?
> It might create confusion between classes and protocol, maybe.
>
> But, on the other side, there is not real reason to limit class extension
> to only method and not to properties. In this case, extending protocol to
> value container might be an interesting way to respond to this. Anyway, we
> might keep the abstract keyword.
>
> Regards,
>
> David
>
> Le 4 déc. 2015 à 10:11, T.J. Usiyan <griotspeak at gmail.com> a écrit :
>
> Hello,
>
> This is an interesting example. I can't refute it without questioning
> decisions/intent rather than code so I'll just say that the `abstract`
> quality you're after still seems like it should be fit into the protocol
> family of features.
>
> TJ
>
> On Fri, Dec 4, 2015 at 3:56 AM, David Scrève <david.screve at dlta-studio.com
> > wrote:
>
>> Hello TJ,
>>
>> Actually not completely…Protocol does not handle properties storage. Only
>> class (and struct) can be made abstract.
>>
>> Doing this with protocol and class required the use of both and you need
>> to enforce developer to inherit from class and implement protocol.. An
>> abstract class encapsulate both on this in a single entity.
>>
>> Here is a sample class for WebService :
>>
>> class WebService {
>> private var lastModified : NSDate
>> var url : String?
>>
>> init() {
>> lastModified=NSDate()
>> }
>>
>> func performCall() {
>> print(self.url)
>> self.lastModified=NSDate()
>> }
>> }
>>
>> As written below, I can create a WebService instance…but I would like to
>> forbid this because URL is a property that must be implemented by inherited
>> classes.
>>
>> I I use a protocol and Protocol extension, I will not be able to have
>> lastModified stored value.
>>
>> My proposal is to add abstract keyword as below :
>>
>> abstract class WebService {
>> private var lastModified : NSDate
>> abstract var url : String?
>>
>> init() {
>> lastModified=NSDate()
>> }
>>
>> func performCall() {
>> print(self.url)
>> self.lastModified=NSDate()
>> }
>> }
>>
>> Then I will not be able to create a WebService object, and enforced to
>> implement url property in inherited classes.
>>
>> Regards,
>>
>> David
>>
>> Le 4 déc. 2015 à 09:43, T.J. Usiyan <griotspeak at gmail.com> a écrit :
>>
>> Hello David,
>>
>> This sounds like something that can be accomplished with protocols and
>> default implementations provided in protocol extensions. If you've watched Protocol-Oriented
>> Programming in Swift [Session 408]
>> <https://developer.apple.com/videos/play/wwdc2015-408/>, slides 168 and
>> on, once he begins talking about Protocol Extensions, is the relevant part.
>> It looks like the functionality that you've described is already present in
>> this feature.
>>
>> TJ
>>
>> On Fri, Dec 4, 2015 at 3:30 AM, David Scrève <
>> david.screve at dlta-studio.com> wrote:
>>
>>> Hi Everyone,
>>>
>>> Nice to see this new swift-evolution process….I’m not sure to
>>> completely understand the whole process of requesting evolutions, but I’m
>>> trying
>>> to do…
>>>
>>> As I develop sort of framework, I usually have classes that I
>>> wanted to partially in the framework and force the user to implement others
>>> parts.
>>>
>>> For example, I have a WebService class that manage the whole
>>> process to perform asynchronous call, error management.
>>> This class has an abstract property that is specific for each
>>> WebService call.
>>>
>>> Then I would like to make the URL property abstract and,
>>> consequently, the whole WebService class abstract : The WebService cannot
>>> be directly instantiated.
>>>
>>> The goal of this feature would be to extend to method.
>>> This behavior already exists in Java and is really useful.
>>>
>>> The workaround is to make an URL property that returns invalid
>>> value or make assertion, but the error is only detected at runtime.
>>>
>>> My proposal would be to just add a keyword before func, class or
>>> var. An abstract property or func should not provide implementation.
>>>
>>> Regards,
>>>
>>>
>>> David
>>>
>>>
>>>
>>> _______________________________________________
>>> 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
>>
>>
>
> _______________________________________________
> 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/20151204/53714029/attachment-0001.html>
More information about the swift-evolution
mailing list