Ajax (1) Apex Class (12) Apex Trigger (2) Community (2) Home Page (1) HTML (4) Integration (3) JS (7) KB (1) Label (1) Licenses (1) Listing (1) Log (1) OOPs (5) Sharing (1) Static Resource (1) Test Class (3) URI (1) Visualforce (10)

Thursday 29 January 2015

Extended Class Example

Open topic with navigation

Extended Class Example

The following is an extended example of a class, showing all the features of Apex classes. The keywords and concepts introduced in the example are explained in more detail throughout this chapter.

// Top-level (outer) class must be public or global (usually public unless they contain                      
// a Web Service, then they must be global)
public class OuterClass { // Static final variable (constant) – outer class level only
  private static final Integer MY_INT; // Non-final static variable - use this to communicate state across triggers
  // within a single request)
  public static String sharedState; // Static method - outer class level only
  public static Integer getInt() { return MY_INT; } // Static initialization (can be included where the variable is defined)
  static { MY_INT = 2; } // Member variable for outer class
  private final String m; // Instance initialization block - can be done where the variable is declared,
  // or in a constructor { m = 'a'; } // Because no constructor is explicitly defined in this outer class, an implicit,
  // no-argument, public constructor exists

  // Inner interface
  public virtual interface MyInterface { // No access modifier is necessary for interface methods - these are always
    // public or global depending on the interface visibility
    void myMethod(); } // Interface extension
  interface MySecondInterface extends MyInterface { Integer method2(Integer i); } // Inner class - because it is virtual it can be extended.
  // This class implements an interface that, in turn, extends another interface.
  // Consequently the class must implement all methods.
  public virtual class InnerClass implements MySecondInterface { // Inner member variables
    private final String s; private final String s2; // Inner instance initialization block (this code could be located above) { this.s = 'x'; } // Inline initialization (happens after the block above executes)
    private final Integer i = s.length(); // Explicit no argument constructor InnerClass() { // This invokes another constructor that is defined later
       this('none'); } // Constructor that assigns a final variable value
    public InnerClass(String s2) { this.s2 = s2; } // Instance method that implements a method from MyInterface.
    // Because it is declared virtual it can be overridden by a subclass.
    public virtual void myMethod() { /* does nothing */ } // Implementation of the second interface method above.
    // This method references member variables (with and without the "this" prefix)
    public Integer method2(Integer i) { return this.i + s.length(); } } // Abstract class (that subclasses the class above). No constructor is needed since
  // parent class has a no-argument constructor
  public abstract class AbstractChildClass extends InnerClass { // Override the parent class method with this signature.
    // Must use the override keyword
    public override void myMethod() { /* do something else */ } // Same name as parent class method, but different signature.
    // This is a different method (displaying polymorphism) so it does not need
    // to use the override keyword
    protected void method2() {} // Abstract method - subclasses of this class must implement this method
    abstract Integer abstractMethod(); } // Complete the abstract class by implementing its abstract method
  public class ConcreteChildClass extends AbstractChildClass { // Here we expand the visibility of the parent method - note that visibility
    // cannot be restricted by a sub-class
    public override Integer abstractMethod() { return 5; } } // A second sub-class of the original InnerClass
  public class AnotherChildClass extends InnerClass { AnotherChildClass(String s) { // Explicitly invoke a different super constructor than one with no arguments
      super(s); } } // Exception inner class
  public virtual class MyException extends Exception { // Exception class member variable
    public Double d; // Exception class constructor MyException(Double d) { this.d = d; } // Exception class method, marked as protected
    protected void doIt() {} } // Exception classes can be abstract and implement interfaces
  public abstract class MySecondException extends Exception implements MyInterface { } }
This code example illustrates:
  • A top-level class definition (also called an outer class)
  • Static variables and static methods in the top-level class, as well as static initialization code blocks
  • Member variables and methods for the top-level class
  • Classes with no user-defined constructor — these have an implicit, no-argument constructor
  • An interface definition in the top-level class
  • An interface that extends another interface
  • Inner class definitions (one level deep) within a top-level class
  • A class that implements an interface (and, therefore, its associated sub-interface) by implementing public versions of the method signatures
  • An inner class constructor definition and invocation
  • An inner class member variable and a reference to it using the this keyword (with no arguments)
  • An inner class constructor that uses the this keyword (with arguments) to invoke a different constructor
  • Initialization code outside of constructors — both where variables are defined, as well as with anonymous blocks in curly braces ({}). Note that these execute with every construction in the order they appear in the file, as with Java.
  • Class extension and an abstract class
  • Methods that override base class methods (which must be declared virtual)
  • The override keyword for methods that override subclass methods
  • Abstract methods and their implementation by concrete sub-classes
  • The protected access modifier
  • Exceptions as first class objects with members, methods, and constructors

This example shows how the class above can be called by other Apex code:

// Construct an instance of an inner concrete class, with a user-defined constructor  OuterClass.InnerClass ic = new OuterClass.InnerClass('x');    // Call user-defined methods in the class  System.assertEquals(2, ic.method2(1));    // Define a variable with an interface data type, and assign it a value that is of 
// a type that implements that interface OuterClass.MyInterface mi = ic; // Use instanceof and casting as usual OuterClass.InnerClass ic2 = mi instanceof OuterClass.InnerClass ? (OuterClass.InnerClass)mi : null; System.assert(ic2 != null); // Construct the outer type OuterClass o = new OuterClass(); System.assertEquals(2, OuterClass.getInt()); // Construct instances of abstract class children System.assertEquals(5, new OuterClass.ConcreteChildClass().abstractMethod()); // Illegal - cannot construct an abstract class
// new OuterClass.AbstractChildClass();

// Illegal – cannot access a static method through an instance
// o.getInt();

// Illegal - cannot call protected method externally
// new OuterClass.ConcreteChildClass().method2();
This code example illustrates:
  • Construction of the outer class
  • Construction of an inner class and the declaration of an inner interface type
  • A variable declared as an interface type can be assigned an instance of a class that implements that interface
  • Casting an interface variable to be a class type that implements that interface (after verifying this using the instanceof operator)
© Copyright 2000–2015 salesforce.com, inc. All rights reserved.
Various trademarks held by their respective owners.

 

No comments:

Post a Comment