<div dir="ltr">On Tue, Oct 29, 2013 at 7:32 PM, Ted Kremenek <span dir="ltr"><<a href="mailto:kremenek@apple.com" target="_blank">kremenek@apple.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><div><div class="h5">On Oct 29, 2013, at 3:16 PM, variadictemplate . <<a href="mailto:variadic.template@googlemail.com" target="_blank">variadic.template@googlemail.com</a>> wrote:<br>
<div><br><blockquote type="cite"><div style="font-family:HelveticaNeue;font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
currently there is no possibility in objective-c to mark a method as "pure virtual" like in C++. I think the "pure-virtual"-construct enables an elegant and clean way to describe and specify APIs, although if it may be a rarely used construct.</div>
<div style="font-family:HelveticaNeue;font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
A workaround for objective-c is to declare the method within the base-class and add to it's implementation an assertion like assert(false && "has to be implemented by subclasses"). But i think it would be nicer when the compiler gives me a hint that there is something wrong, instead of crashing the app at runtime.</div>
<div style="font-family:HelveticaNeue;font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
<br></div><div style="font-family:HelveticaNeue;font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
So, with my attached patch I'm introducing an attribute for that case, named objc_pure_virtual_method. It can only be attached to methods of a class-declaration (the other way round: extensions, categories and protocols are excluded). If a subclass does not implement the method, it will cause a warning. If the subclass redeclares the method within it's @interface-declaration and also adds the objc_pure_virtual_method, no warning will be generated. If the call of an init-method to an instance of a class with pure virtual methods is detected, an error is generated.</div>
<div style="font-family:HelveticaNeue;font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
<br></div><div style="font-family:HelveticaNeue;font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
I'm not sure if the init-call to a subclass of an abstract class, that did not implement all pure virtual methods, should also produce an error, as this case already produces warnings of unimplemented methods - in my eyes, this is sufficient.</div>
<div style="font-family:HelveticaNeue;font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
<br></div><div style="font-family:HelveticaNeue;font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
Surely there are some issues with my current implementation, as i'm not so sure if i have chosen the right places to add the logic and about the names / warnings i have chosen and I'm happy to hear any suggestion / <a href="http://www.dict.cc/englisch-deutsch/criticism.html" style="font-size:13px;text-decoration:none;font-family:arial,helvetica,sans-serif" target="_blank">criticism</a>.</div>
</blockquote></div><div><br></div></div></div></div></blockquote><div><br></div><div>I have also been in a situation where I have done the assert(false && "has to be implemented by subclasses") thing, but it is very rare. In Objective C subclassing is (compared to most OOP languages) infrequent and shallow. Since most the framework code in Cocoa/CocoaTouch/GNUStep chooses to use delegation as opposed subclassing it is generally possible to achieve the same sort of compile time warnings by having @required methods in a formal protocol on a delegate.</div>
<div><br></div><div>While I am generally in favor of adding annotations, I wonder if it is worthwhile to add an annotation for something that is really not a common idiomatic pattern in the language?</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div style="word-wrap:break-word"><div>(2) In a subclass, if a method is redeclared as being “non-virtual”, should we also guarantee that it is implemented in the @implementation?  That may be tricky of course with categories.</div>
</div></blockquote><div> </div><div>I suspect you can get into similar situations today where the compiler does not have enough info to do things with @required in formal protocols and categories. I am sure you can if you are using class_addMethod to provide the IMPs at runtime. The language already provides @dynamic for dealing with that with respect to properties. Extending @dynamic to methods would work for the proposed annotation (if it makes sense to do the annotation at all) and solve the issue with formal protocols (though in practice I am not sure I have seen the cases ever come up, they are sort of pathological).</div>
<div><br></div><div>Louis</div></div></div></div>