Friday, May 24, 2013

Interfaces and Extending Classes in Apex

Interface:
An interface is like a class in which none of the methods have been implemented—the method signatures are there, but the body of each method is empty. To use an interface, another class must implement it by providing a body for all of the methods contained in the interface. 

Interfaces can provide a layer of abstraction to your code. They separate the specific implementation of a method from the declaration for that method. This way you can have different implementations of a method based on your specific application. 

Defining an interface is similar to defining a new class. For example, a company might have two types of purchase orders, ones that come from customers, and others that come from their employees. Both are a type of purchase order. Suppose you needed a method to provide a discount. The amount of the discount can depend on the type of purchase order. 

You can model the general concept of a purchase order as an interface and have specific implementations for customers and employees. In the following example the focus is only on the discount aspect of a purchase order.

public class PurchaseOrders 
{
 
    // An interface that defines what a purchase order looks like in general
     
   public interface PurchaseOrder 
   {
        // All other functionality excluded
        Double discount();
    }
 
    // One implementation of the interface for customers
    
    public virtual class CustomerPurchaseOrder implements PurchaseOrder 
    {
        public virtual Double discount() {
            return .05;  // Flat 5% discount
        }
    }

   // Employee purchase order extends Customer purchase order, but with a 
   // different discount
     
    public class EmployeePurchaseOrder extends CustomerPurchaseOrder
    {
          public  override Double discount() 
        {
            return .10;  // It’s worth it being an employee! 10% discount
        } 
   }    
}


 Notes:

  • The interface PurchaseOrder is defined as a general prototype. Methods defined within an interface have no access modifiers and contain just their signature.
  • The CustomerPurchaseOrder class implements this interface; therefore, it must provide a definition for the discount method. As with Java, any class that implements an interface must define all of the methods contained in the interface.
  • The employee version of the purchase order extends the customer version. A class extends another class using the keyword extends. A class can only extend one other class, but it can implement more than one interface.
  • When you define a new interface, you are defining a new data type. You can use an interface name in any place you can use another data type name. If you define a variable whose type is an interface, any object you assign to it must be an instance of a class that implements the interface, or a sub-interface data type.
  • An interface can extend another interface. As with classes, when an interface extends another interface, all the methods and properties of the extended interface are available to the extending interface.

No comments: