CSC/ECE 517 Fall 2007/wiki2 10 c4

From Expertiza_Wiki
Revision as of 02:06, 23 October 2007 by Lwillia (talk | contribs) (→‎Example 1)
Jump to navigation Jump to search

Introduction

Problem

Inheritance vs. delegation. Follow the debate on inheritance vs. delegation. Construct (or, better, cite) examples that show cases where inheritance is better, and cases where delegation is better. Attempt to characterize the situations in which you should employ one or the other.

Inheritance

Inheritance is the process of one class having access to another class's attributes. Inheritance occurs when a class, also called the superclass, is created with generalized methods and attributes, and then another class is created as a subclass to the first class. The subclass provides provides detailed methods and attributes and automatically has access to methods and data members of the superclass. These subclasses can also override the generalized methods of the super class. Sometimes subclasses inherit from more than one super class; the occurrance of this is naturally called multiple inheritance.[1]

Delegation

Delegation is the process of assigning the implementation of a method, within a class, to another method. Generally, the implementation responsibility is forwarded to the parent class. If the parent class can not handle the implementation responsibility, it forwards it to its parent and so on and so on. This forwarding allows a class to dynamically change by changing the parent class relations. Delegation is also called dynamic inheritance.[2]

Inheritance vs Delegation

Inheritance and delegation are used in different situations in object oriented programming. Although they can be used simultaneously, its rarely done due to the difficulty in it. Most of the time people use them interchangeably but are doing so incorrectly.

When to use Inheritance

  • Inheritance is used when two objects are of the same type but one of the objects needs to handle somethings differently. The second object would inherit from the first and simply rewrite the code needed in the second object.[3]
  • Inheritance is used in is-a relationships between objects. [3]
  • Inheritance is used to sub categorize objects.[3]
  • Inheritance should be restricted to objects of the same type.[3]

When to use Delegation

  • Delegation is used when two objects aren't of the same type but one has methods and attributes that the other wants to use internally.[3]
  • Delegation is used in has-a relationships where the type of object that is included may change during runtime.
  • Delegation is used when methods implementation needs to be handled by some other class within the parent tree. The class that will handle the method isn't known right away. [6]
  • When code execution within objects needs to be determined dynamically.


Construct (or, better, cite) examples that show cases where inheritance is better, and cases where delegation is better. Attempt to characterize the situations in which you should employ one or the other.

Inheritance is Better

Example 1

Inheritance is better in this example because any specific account type will require []

public class Account {

  protected double balance; // Constructor to initialise balance 
     
  public Account( double amount ) { 
     balance = amount; 
  } 
  // Overloaded constructor for empty balance 
  public Account() { 
     balance = 0.0; 
  } 
  public void deposit( double amount ) { 
     balance += amount; 
  } 
  public double withdraw( double amount ) { 
     // See if amount can be withdrawn 
     if (balance >= amount) { 
        balance -= amount; return amount; 
     } else 
     // Withdrawal not allowed return 0.0; 
  } 
  public double getbalance() { 
     return balance; 
  } 

}


class InterestBearingAccount extends Account{

  private static double default_interest = 7.95;
  private double interest_rate;
  // Overloaded constructor accepting balance and an interest rate
  public InterestBearingAccount( double amount, double interest){
     balance = amount;
     interest_rate = interest;
  }
  // Overloaded constructor accepting balance with a default interest rate
  public InterestBearingAccount( double amount ){
     balance = amount;
     interest_rate = default_interest;
  }
  // Overloaded constructor with empty balance and a default interest rate
  public InterestBearingAccount(){
      balance = 0.0;
      interest_rate = default_interest;
  }
  public void add_monthly_interest(){
     // Add interest to our account
     balance = balance + 		
    (balance * interest_rate / 100) / 12;
  }

}

References

  1. http://searchsmb.techtarget.com/sDefinition/0,,sid44_gci212351,00.html
  2. http://www.ccs.neu.edu/research/demeter/papers/context-journal/node3.html
  3. http://www.tek-tips.com/viewthread.cfm?qid=372254
  4. http://www.python.org/ftp/python/doc/delegation.ps
  5. http://www.softwarefederation.com/csci4448/courseNotes/05_ObjectOrientedDesign.pdf
  6. http://www.javaworld.com/javaworld/javaqa/2001-09/01-qa-0914-delegate.html