Jon Jagger
jon@jaggersoft.com
Table of Contents 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Notes DownloadECMA-334 C# Language Specificationpreviousnextprevious at this levelnext at this level 17 Classesprevious at this levelnext at this level 17.5 Methodsprevious at this levelnext at this level 17.5.4 Override methods Paragraph 11 When an instance method declaration includes an override modifier, the method is said to be an override method. 2 An override method overrides an inherited virtual method with the same signature. 3 Whereas a virtual method declaration introduces a new method, an override method declaration specializes an existing inherited virtual method by providing a new implementation of that method. Paragraph 21 The method overridden by an override declaration is known as the overridden base method. 2 For an override method M declared in a class C, the overridden base method is determined by examining each base class of C, starting with the direct base class of C and continuing with each successive direct base class, until an accessible method with the same signature as M is located. 3 For the purposes of locating the overridden base method, a method is considered accessible if it is public, if it is protected, if it is protected internal, or if it is internal and declared in the same program as C. Paragraph 31 A compile-time error occurs unless all of the following are true for an override declaration: Paragraph 41 An override declaration can access the overridden base method using a base-access (§14.5.8). [Example: In the example
class A  
{  
   int x;  
   public virtual void PrintFields() {  
      Console.WriteLine("x = {0}", x);  
   }  
}  
class B: A  
{  
   int y;  
   public override void PrintFields() {  
      base.PrintFields();  
      Console.WriteLine("y = {0}", y);  
   }  
}  
the base.PrintFields() invocation in B invokes the PrintFields method declared in A. A base-access disables the virtual invocation mechanism and simply treats the base method as a non-virtual method.
Had the invocation in B been written ((A)this).PrintFields(), it would recursively invoke the PrintFields method declared in B, not the one declared in A, since PrintFields is virtual and the run-time type of ((A)this) is B. end example] Paragraph 51 Only by including an override modifier can a method override another method. 2 In all other cases, a method with the same signature as an inherited method simply hides the inherited method. [Example: In the example
class A  
{  
   public virtual void F() {}  
}  
class B: A  
{  
   public virtual void F() {}   // Warning, hiding inherited F()  
}  
the F method in B does not include an override modifier and therefore does not override the F method in A. Rather, the F method in B hides the method in A, and a warning is reported because the declaration does not include a new modifier. end example]
[Example: In the example
class A  
{  
   public virtual void F() {}  
}  
class B: A  
{  
   new private void F() {}     // Hides A.F within B  
}  
class C: B  
{  
   public override void F() {}  // Ok, overrides A.F  
}  
the F method in B hides the virtual F method inherited from A. Since the new F in B has private access, its scope only includes the class body of B and does not extend to C. Therefore, the declaration of F in C is permitted to override the F inherited from A. end example]
{ JSL }
Jagger Software Ltd
Company # 4070126
VAT # 762 5213 42
Valid HTML 4.01Valid CSS