To create a new Class Definition file, from the VB menu, select Project / Add Class Module.
Help Topics
Only one Construction | Class_Initialize | |
Only one Destructor | Class_Terminate |
Private HiddenVariable As Integer Public Property Get PropertyName() As Integer PropertyName = HiddenVariable End Property Public Property Let PropertyName(ByVal x As Integer) If x > 5 and x < 8 then HiddenVariable = x End If End PropertyTo set a default property, use Tools / Procedure Attributes... / Advanced>> and set Procedure ID to (Default). Be very sure that only one method or property is defined as the default since the compiler does not check for multiples.
You cannot implement true static class data which is available to all objects of the same class. Instead, you have to fake it by defining a public variable in another module (.bas file) and use class methods to access it.
Instantiating an Object
Set x = Nothing
TField = class private X, Y, Len: Integer; FName: string; FStr: string; public constructor Copy(F: TField); constructor Create(FX, FY, FLen: Integer; FName: string); destructor destroy; override; procedure Display; virtual; procedure Edit ; dynamic; protected function GetStr: string; virtual; function SetStr(S: string): Boolean; virtual; procedure Something; virtual; abstract; private procedure DisplayStr(X, Y: Integer; S: string); public property Str: String read GetStr write SetStr; // Methods must be defined // before they are used // in a property published property Cnt: Integer read GetCnt write SetCnt default 30; end;Properties that are defined as published are displayed in the Object Inspector at design time and can be modified by the developer.
In a property, the read directive must come before the write directive.
The default directive is used with numbers, if the value in the object inspector is different from the default value, then the value is saved in the *.dfm file. It does not actually set the value of the property. You must assign all data fields to their default values in the component's constructor(s). String properties can not have a default directive, and all strings <>'' are stored in the *.dfm file. ref
type PTRectangle = ^TRectangle; // Pointers to a type can be defined before the type TRectangle = class(TFigure) procedure Draw; override; : end; TEllipse = class(TFigure) procedure Draw; override; : end;The following section of code illustrates the effect of calling a virtual method through a class type variable whose actual type varies at run-time.
var Figure: TFigure; // This does not allocate any memory begin Figure := TRectangle.Create; // This allocates memory Figure.Draw; { Invokes TRectangle.Draw } Figure.Destroy; Figure := TEllipse.Create; Figure.Draw; { Invokes TEllipse.Draw } Figure.Destroy; end;The allowed subroutine (method) types are
constructor | Called when the object is crearted |
destructor | Called when the object goes out of scope |
function | Returns a value |
procedure | Does not return a value |
property | Redirects reads and writes to properties to method calls |
Abstract virtual methods do not have any code defined. These must be overridden before they are called.
inherited - Calling inherited with an abstract virtual method will generate a run time exception.
type TMyType = record a: string; b: string; end; var MyArray : Tlist; MyType : Tmytype; PMyType : ^Tmytype; implementation procedure TForm1.FormCreate(Sender: TObject); begin MyArray:= tlist.create; new (Pmytype); // This allocates memory and initializes the pointer MyArray.add(PMyType); end;When designing components, use this to keep methods from running at design time.
if csDesigning in ComponentState then begin Exit; end;
Multiple inheritance is partially supported using interfaces - special classes which contain only abstract methods.
Methods (function and procedures) can be defined as class methods which can be accessed without specifying an instance (object).
class function SetStr(S: string): Boolean; virtual; class procedure Something; virtual; tMyType.something; // This will call the procedure
C++ Builder
struct SomeName{ char str1[20]; char str2[4]; short x; short y; }; // The semicolon is required // Instances can be created in the definition by placing // variable names before the final semicolon SomeName var1; // Declare a variable of that type SomeName varArray[4]; // An array of structures strcpy(var1.str1, "A string"); var1.x = 35; varArray[2].y = 66 ;A class is just like a structure except that the default access is private.
Allows multiple inheritence.
public class NewName extends ExistingClass{ public integer someValue = 5; static int someCounter = 0; // defines a "Class Variable" who's value // is available in all instances of this class public void method1() { this.someValue = 8 ; // Variable in this class super.anotherValue = 3 ; // Variable in parent class } public NewName (int a) { // Constructors have the same name as the class this(null, a) ; // "this" calls another constructor in this class // (see JTextField.java for examples) } public NewName (int a, int b) { // There can be many constructors // as long as each one has different parameters } } NewName ClassInstance = new NewName() ; // allocate some memory NewName.someCounter++ ; // "Class Variables" are referenced using the class name ClassInstance.someValue = 4 ;Java 1.1 lacks property definitions. Instead, you simply make the attribute private and define 2 public methods - one to read and another to write. By convention, most development systems treat getName and setName are interpreted as the parameter name.
static is used to define Class Variables and Methods. These allocate space once regardless of how many instances are allocated. These can be referenced using either the class name or the name of a variable that references a specific instance. You can use Class Methods to read and write Class Variables.
Constructors do not return a value and
have the same name of the class.
Classes frequently have multiple constructors.
One of the advertised advantages of java is that multiple inheritance is NOT supported. (A dubious advantage at best.) Then, in standard doublespeak, you are told that multiple inheritance IS supported when interface classes are inherited.
BTW, Java does not support events, it uses interfaces instead. (Same idea, different name.)