<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to keywords-abstract</title><link>https://sourceforge.net/p/asil/wiki/keywords-abstract/</link><description>Recent changes to keywords-abstract</description><atom:link href="https://sourceforge.net/p/asil/wiki/keywords-abstract/feed" rel="self"/><language>en</language><lastBuildDate>Mon, 17 Feb 2014 07:03:16 -0000</lastBuildDate><atom:link href="https://sourceforge.net/p/asil/wiki/keywords-abstract/feed" rel="self" type="application/rss+xml"/><item><title>keywords-abstract modified by Will Pittenger</title><link>https://sourceforge.net/p/asil/wiki/keywords-abstract/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v2
+++ v3
@@ -67,6 +67,7 @@
 There may be some circumstances where you want to provide a **[get](keywords-get)** access implementation, but not the **[set](keywords-set)** accessor implementation or vice versa.  ASIL allows this.  In fact, you can make one non-virtual if you need to.  The following sample would go inside a property declaration.  If the **abstract** and **[virtual](keywords-virtual)** keywords are both missing from an accessor, it defaults to the modifiers applied to the property itself.

 ~~~~
+:::text
 {(\public\ | \protected\ | \private\) | [(\abstract\ | \virtual\ | \override\)]} (\get\ | \set\)
   ' Implement non-abstract accessors here
 ~~~~
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Will Pittenger</dc:creator><pubDate>Mon, 17 Feb 2014 07:03:16 -0000</pubDate><guid>https://sourceforge.netc49af04b551355a7f79e0d6723cfb2943155b6cc</guid></item><item><title>keywords-abstract modified by Will Pittenger</title><link>https://sourceforge.net/p/asil/wiki/keywords-abstract/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v1
+++ v2
@@ -2,11 +2,12 @@

 Overview
 --------
-This keyword is used in two contexts: To mark a class as abstract and to mark a method or property in that class as abstract.  Abstract classes are allowed to have virtual functions that they implement or override.  However, generally, they will have at least one abstract method or property.  Such methods or properties don't have an implementation in the class being declared.  Rather, it's up to a derived class to implement those methods and/or properties.  An abstract class can't be instantiated as is.  You need to derive first and instantiate that.  Abstract methods and properties can't be private.
+This keyword is used in two contexts: To mark a class as abstract and to mark a method or property in that class as abstract.  Abstract classes are allowed to have virtual functions that they implement or override.  However, generally, they will have at least one abstract method or property.  Such methods or properties don't have an implementation in the class being declared.  Rather, it's up to a derived class to implement those methods and/or properties.  An abstract class can't be instantiated as is.  You need to derive first and instantiate that.  Abstract methods and properties can't be private.  Structures can't be abstract as they lack virtual method tablets.

 The class declaration
 ---------------------
 ~~~~
+:::text
 [(\abstract\ | \static\)] \class\ /identifier/
   [\extends\ /baseTypeList/]
   [\implements\ /interfaceList/]
@@ -17,6 +18,7 @@
 Abstract commands
 -----------------
 ~~~~
+:::text
 {(\public\ | \protected\ | \private\) | [(\abstract\ | \virtual\ | \override\)]} \command\  /identifier/ /DeclarationSequence/]
   ' Implement non-abstract commands here
 ~~~~
@@ -28,9 +30,45 @@
 This syntax is nearly identical to what's listed above.

 ~~~~
+:::text
 {(\public\ | \protected\ | \private\) | [(\abstract\ | \virtual\ | \override\)]} \function\  /identifier/ /DeclarationSequence/]
     returns /TypeDescriptor/
   ' Implement non-abstract commands here
 ~~~~

 Note: The private keyword is shown, but is incompatible with abstract functions.  For more on declaration sequences, see [Declaration Sequences](Appendices-Terms-Declaration sequences).  For more on type descriptors, see [Type Descriptors](Appendicies-Terms-Type descriptors).
+
+Abstract complex statements
+---------------------------
+Note the similarities to the syntax needed for a complex statement delegate.  This is the only abstract method type where the syntax differs from that of a normal method.  Note that the private access qualifier keyword isn't an option.
+
+~~~~
+:::text
+(\public\ | \protected\) \abstract\ \statement\ /identifier/ /DeclarationSequence/
+  \instructions\ [/TypeDescriptorList/]
+~~~~
+
+For more on declaration sequences, see [Declaration Sequences](Appendices-Terms-Declaration sequences).  /TypeDescriptorList/, if present, must be a comma delimited list of type descriptors.  For more on type descriptors, see [Type Descriptors](Appendicies-Terms-Type descriptors).
+
+Abstract properties
+-------------------
+If you want each accessor declared by a property to be abstract, make the property itself abstract.  Note: Nothing prevents derived classes from providing accessors not declared by a base type, abstract or otherwise.
+
+~~~~
+:::text
+{(\public\ | \protected\ | \private\) | [(\abstract\ | \virtual\ | \override\)]} \property\ /TypeDescriptor/ /identifier/ [\]/DeclarationSequence/\]\]
+  ' Put accessors here
+~~~~
+
+Note: The private keyword is shown, but is incompatible with abstract properties.  For more on declaration sequences, see [Declaration Sequences](Appendices-Terms-Declaration sequences).  For more on type descriptors, see [Type Descriptors](Appendicies-Terms-Type descriptors).  This sample includes the portion needed for an indexed property.
+
+Abstract property accessors
+---------------------------
+There may be some circumstances where you want to provide a **[get](keywords-get)** access implementation, but not the **[set](keywords-set)** accessor implementation or vice versa.  ASIL allows this.  In fact, you can make one non-virtual if you need to.  The following sample would go inside a property declaration.  If the **abstract** and **[virtual](keywords-virtual)** keywords are both missing from an accessor, it defaults to the modifiers applied to the property itself.
+
+~~~~
+{(\public\ | \protected\ | \private\) | [(\abstract\ | \virtual\ | \override\)]} (\get\ | \set\)
+  ' Implement non-abstract accessors here
+~~~~
+
+Note: The private keyword is shown, but is incompatible with abstract property accessors.  For more on declaration sequences, see [Declaration Sequences](Appendices-Terms-Declaration sequences).
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Will Pittenger</dc:creator><pubDate>Mon, 17 Feb 2014 07:02:47 -0000</pubDate><guid>https://sourceforge.net2b9c2492285ae8f9cc71fe2e776e9762a98f01b7</guid></item><item><title>keywords-abstract modified by Will Pittenger</title><link>https://sourceforge.net/p/asil/wiki/keywords-abstract/</link><description>&lt;div class="markdown_content"&gt;&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#overview"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-class-declaration"&gt;The class declaration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#abstract-commands"&gt;Abstract commands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#abstract-functions"&gt;Abstract functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;This keyword is used in two contexts: To mark a class as abstract and to mark a method or property in that class as abstract.  Abstract classes are allowed to have virtual functions that they implement or override.  However, generally, they will have at least one abstract method or property.  Such methods or properties don't have an implementation in the class being declared.  Rather, it's up to a derived class to implement those methods and/or properties.  An abstract class can't be instantiated as is.  You need to derive first and instantiate that.  Abstract methods and properties can't be private.&lt;/p&gt;
&lt;h2 id="the-class-declaration"&gt;The class declaration&lt;/h2&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;abstract&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;extends&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;baseTypeList&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;implements&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;interfaceList&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;/identifier/ must be a valid identifier.  /baseTypeList/ must be a comma delimited list of types to derive from.  Leave that clause out if you only need Object as a base type.  /interfaceList/ must be a comma delimited list of interfaces that the class will implement (or, given we're talking about an abstract class, require to be to be implemented by derived classes).  Omit that clause if you don't need interfaces implemented.&lt;/p&gt;
&lt;h2 id="abstract-commands"&gt;Abstract commands&lt;/h2&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;protected&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;abstract&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;virtual&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;override&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="p"&gt;)]}&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;DeclarationSequence&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="n"&gt;Implement&lt;/span&gt; &lt;span class="n"&gt;non&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;abstract&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt; &lt;span class="n"&gt;here&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note: The private keyword is shown, but is incompatible with abstract commands.  For more on declaration sequences, see &lt;a class="" href="../Appendices-Terms-Declaration%20sequences"&gt;Declaration Sequences&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="abstract-functions"&gt;Abstract functions&lt;/h2&gt;
&lt;p&gt;This syntax is nearly identical to what's listed above.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="kr"&gt;public&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="kr"&gt;protected&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="kr"&gt;private&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;abstract&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;virtual&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;override&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;identifier&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sr"&gt;/DeclarationSequence/&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nx"&gt;returns&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;TypeDescriptor&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="nx"&gt;Implement&lt;/span&gt; &lt;span class="nx"&gt;non&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kr"&gt;abstract&lt;/span&gt; &lt;span class="nx"&gt;commands&lt;/span&gt; &lt;span class="nx"&gt;here&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note: The private keyword is shown, but is incompatible with abstract functions.  For more on declaration sequences, see &lt;a class="" href="../Appendices-Terms-Declaration%20sequences"&gt;Declaration Sequences&lt;/a&gt;.  For more on type descriptors, see &lt;a class="" href="/p/asil/wiki/Appendicies-Terms-Type%20descriptors/"&gt;Type Descriptors&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Will Pittenger</dc:creator><pubDate>Mon, 17 Feb 2014 06:37:56 -0000</pubDate><guid>https://sourceforge.net65edc780ba506b72cf5a94b9961037b84d21c579</guid></item></channel></rss>