disable broken tests on net_4_0
[mcs.git] / docs / ecma334 / 17.6.3.xml
blob29766347ce755a9b9f6410fd2fc5afe87ff26f99
1 <?xml version="1.0"?>
2 <clause number="17.6.3" title="Virtual, sealed, override, and abstract accessors">
3   <paragraph>A virtual property declaration specifies that the accessors of the property are virtual. The virtual modifier applies to both accessors of a read-write property-it is not possible for only one accessor of a read-write property to be virtual. </paragraph>
4   <paragraph>An abstract property declaration specifies that the accessors of the property are virtual, but does not provide an actual implementation of the accessors. Instead, non-abstract derived classes are required to provide their own implementation for the accessors by overriding the property. Because an accessor for an abstract property declaration provides no actual implementation, its <non_terminal where="17.6.2">accessor-body</non_terminal> simply consists of a semicolon. </paragraph>
5   <paragraph>A property declaration that includes both the abstract and override modifiers specifies that the property is abstract and overrides a base property. The accessors of such a property are also abstract. </paragraph>
6   <paragraph>Abstract property declarations are only permitted in abstract classes (<hyperlink>17.1.1.1</hyperlink>). The accessors of an inherited virtual property can be overridden in a derived class by including a property declaration that specifies an override directive. This is known as an overriding property declaration. An overriding property declaration does not declare a new property. Instead, it simply specializes the implementations of the accessors of an existing virtual property. </paragraph>
7   <paragraph>An overriding property declaration must specify the exact same accessibility modifiers, type, and name as the inherited property. If the inherited property has only a single accessor (i.e., if the inherited property is read-only or write-only), the overriding property must include only that accessor. If the inherited property includes both accessors (i.e., if the inherited property is read-write), the overriding property can include either a single accessor or both accessors. </paragraph>
8   <paragraph>An overriding property declaration may include the sealed modifier. Use of this modifier prevents a derived class from further overriding the property. The accessors of a sealed property are also sealed. </paragraph>
9   <paragraph>Except for differences in declaration and invocation syntax, virtual, sealed, override, and abstract accessors behave exactly like virtual, sealed, override and abstract methods. Specifically, the rules described in <hyperlink>17.5.3</hyperlink>, <hyperlink>17.5.4</hyperlink>, <hyperlink>17.5.5</hyperlink>, and <hyperlink>17.5.6</hyperlink> apply as if accessors were methods of a corresponding form: <list><list_item> A get accessor corresponds to a parameterless method with a return value of the property type and the same modifiers as the containing property. </list_item><list_item> A set accessor corresponds to a method with a single value parameter of the property type, a <keyword>void</keyword> return type, and the same modifiers as the containing property. </list_item></list></paragraph>
10   <paragraph>
11     <example>[Example: In the example <code_example><![CDATA[
12 abstract class A  
13 {  
14    int y;  
15    public virtual int X {  
16       get { return 0; }  
17    }  
18    public virtual int Y {  
19       get { return y; }  
20       set { y = value; }  
21    }  
22    public abstract int Z { get; set; }  
23 }  
24 ]]></code_example></example>
25   </paragraph>
26   <paragraph>
27     <example>X is a virtual read-only property, Y is a virtual read-write property, and Z is an abstract read-write property. </example>
28   </paragraph>
29   <paragraph>
30     <example>Because Z is abstract, the containing class A must also be declared abstract. </example>
31   </paragraph>
32   <paragraph>
33     <example>A class that derives from A is show below: <code_example><![CDATA[
34 class B: A  
35 {  
36    int z;  
37    public override int X {  
38       get { return base.X + 1; }  
39    }  
40    public override int Y {  
41       set { base.Y = value < 0? 0: value; }  
42    }  
43    public override int Z {  
44       get { return z; }  
45       set { z = value; }  
46    }  
47 }  
48 ]]></code_example></example>
49   </paragraph>
50   <paragraph>
51     <example>Here, the declarations of X, Y, and Z are overriding property declarations. Each property declaration exactly matches the accessibility modifiers, type, and name of the corresponding inherited property. The get accessor of X and the set accessor of Y use the base keyword to access the inherited accessors. The declaration of Z overrides both abstract accessors-thus, there are no outstanding abstract function members in B, and B is permitted to be a non-abstract class. end example]</example>
52   </paragraph>
53 </clause>