PBXB64 OOP & Classes

OOP & Classes Standard

Full object-oriented programming with CLASS, INTERFACE, METHOD, PROPERTY, EVENTS FROM, EVENTS END, RAISEEVENT, IMPLEMENTS, and WITH. Multi-subscriber event dispatch, interface inheritance, and property accessors. All backed by real vtable and event-helper runtime code.

CLASS with METHOD and PROPERTY

Class definition and usage
CLASS MyClass INSTANCE count AS LONG CLASS METHOD Create() AS LONG count = 0 METHOD = 0 END METHOD CLASS METHOD Increment() AS LONG count = count + 1 METHOD = count END METHOD CLASS PROPERTY Counter() AS LONG PROPERTY = count END PROPERTY END CLASS FUNCTION PBMAIN() AS LONG LOCAL obj AS MyClass obj = CLASS "MyClass" obj.Increment obj.Increment PRINT "Count: "; obj.Counter ' 2 FUNCTION = 0 END FUNCTION

CLASS defines a type with INSTANCE variables, METHOD subroutines, and PROPERTY accessors. Objects are created with CLASS "name". METHOD and PROPERTY are called via dot notation with real vtable dispatch.

EVENTS FROM / EVENTS END / RAISEEVENT

Multi-subscriber events
CLASS EventSource EVENTS FROM MyEvent(iValue AS LONG) CLASS METHOD Trigger() AS LONG RAISEEVENT MyEvent(42) METHOD = 0 END METHOD END CLASS CLASS Listener1 CLASS METHOD MyEvent(iValue AS LONG) AS LONG PRINT "Listener1 got: "; iValue METHOD = 0 END METHOD END CLASS CLASS Listener2 CLASS METHOD MyEvent(iValue AS LONG) AS LONG PRINT "Listener2 got: "; iValue METHOD = 0 END METHOD END CLASS FUNCTION PBMAIN() AS LONG LOCAL src AS EventSource LOCAL l1 AS Listener1 LOCAL l2 AS Listener2 src = CLASS "EventSource" l1 = CLASS "Listener1" l2 = CLASS "Listener2" ' Both listeners receive the event src.Trigger ' Prints: Listener1 got: 42 / Listener2 got: 42 FUNCTION = 0 END FUNCTION

EVENTS FROM defines a multi-subscriber event interface. RAISEEVENT dispatches to all registered listeners via runtime helpers (bestof_events_from, bestof_events_end, bestof_raiseevent_0..6). Full regression test: test_class_events_multi.pb.

WITH - Block-level Member Access

WITH block for shorthand access
FUNCTION PBMAIN() AS LONG LOCAL obj AS MyClass obj = CLASS "MyClass" WITH obj .Increment .Increment PRINT "Count: "; .Counter END WITH FUNCTION = 0 END FUNCTION

WITH saves the object reference and expands .field / .method prefixes throughout the block. The variable is stored in fn->with_var and used by the expression and decl parsers. No more repeating the object name.

Back to feature list