PBXB64 OOP & Klassen
OOP & Klassen
Standard
Vollständige objektorientierte Programmierung with CLASS, INTERFACE, METHOD, PROPERTY, EVENTS FROM, EVENTS END, RAISEEVENT, IMPLEMENTS, and WITH. Multi-Subscriber-Event-Dispatch, Interface-Vererbung, and Property-Accessoren. Alles unterstützt von echtem Vtable- und Event-Helper-Runtime-Code.
CLASS with METHOD and PROPERTY
Klassen-Definition und -Verwendung
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 definiert einen Typ mit INSTANCE-Variablen, METHOD subroutines, and PROPERTY accessors. Objects are created with CLASS "name". METHOD and PROPERTY are aufgerufen 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 dispatched an alle registrierten Listener via runtime helpers (bestof_events_from, bestof_events_end, bestof_raiseevent_0..6). Full regression test: test_class_events_multi.pb.
WITH - Block-Weitiges Member-Zugriff
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 speichert die Objekt-Referenz 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.