spacer

Webref WebRef   Sitemap · Experts · Tools · Services · Newsletters · About i.com

home / experts / javascript / column110


JScript .NET, Part IV: Inheritance

Sr. Web Developer
mediabistro.com
US-NY-New York

Justtechjobs.com Post A Job | Post A Resume
Developer News
Microsoft Shows Off Silverlight 4, IE9 Plans
Metasploit Expands Vulnerability Test Framework
HyperCard Reborn?


Protecting Methods from Overriding

When you define a class for other developers to use, there is always a chance that it will be extended. You need to adopt a defensive attitude, thinking how to protect your class from being corrupted by any derived class. One way is to label your classes and methods as final. Marking your class as final is trivial, but does not buy you much. In fact, it can be counter-beneficial. Your classes will not be reused by other team members, and you will not be contributing to the efficiency of the team as you might have done if you shared your classes. Marking selected functions as final is a more logical thing to do. In this way, you prevent people from overriding your implementation with the override modifier. You also prevent them from hiding your implementation with the hide modifier. So, whether your variable is of the base class or the derived class type, the only definition that rules is yours.

You cannot mark Interfaces and members of interfaces as final. You cannot combine the final modifier with the other inheritance modifier, abstract. You cannot combine the inheritance modifiers with the static modifier, either. By default, class members are neither final nor abstract, so overriding is the default. The following example demonstrates the usage of the final modifier. We begin as on the previous page, with definitions of a base class and a derived class:

class FirstBase {
  final function pitcher()
    { print("I am a pitcher on first base"); }
  function hitter()
    { print("I am a hitter on first base"); }
}

class SecondBase extends FirstBase {
  function pitcher()
    { print("I am a pitcher on second base"); }
  function hitter()
    { print("I am a hitter on second base"); }
}

Now, we define a variable, player1, of the derived class SecondBase, and we create it with the derived class default constructor:

var player1 : SecondBase = new SecondBase;

We then assign the new object to the variable player2, defined as of the base class type:

player2 : FirstBase = player1;

The following code:

player2.pitcher();
player2.hitter();

yields the next two lines:

I am a pitcher on first base
I am a hitter on second base

You can see that the pither() method is that of the base class, while the hitter() method is of the derived class. The base class method won because of its final modifier. The derived class method won because overriding is the default, and the base class function was not marked with final.


Next: A Final Word

internet.commediabistro.comJusttechjobs.comGraphics.com

Search:

WebMediaBrands Corporate Info

Legal Notices, Licensing, Permissions, Privacy Policy.
Advertise | Newsletters | Shopping | E-mail Offers | Freelance Jobs

webref The latest from WebReference.com Browse >
Rolling Out Your Own HTML Application Version Control · HTML 5: Client-side Storage · Working with Ajax Server Extensions
Sitemap · Experts · Tools · Services · Email a Colleague · Contact FREE Newsletters 
 The latest from internet.com
Wi-Fi Product Watch, November 2009 · Chip Market Recovering From '08 Collapse · Low-Cost Tools to Kickstart Your New Business


Produced by Yehuda Shiran and Tomer Shiran
All Rights Reserved. Legal Notices.
Created: May 20, 2002
Revised: May 20, 2002

URL: http://www.webreference.com/js/column110/6.html