Seite 1 von 1

OOP Precompiler

Verfasst: 18.02.2017 22:01
von jensknaack
Hallo,

im Forum und auch allgemein im Internet habe ich einige Links und Hinweise auf OOP-Precompiler gefunden. Es scheint mir allerdings, dass es keinen funktionierenden Download-Link gibt.

Täusche ich mich, oder sind sämtliche Projekte eingestellt/deaktiviert?

Herzlichen Dank für eventuelle Auskünfte
Jens

Re: OOP Precompiler

Verfasst: 18.02.2017 22:17
von ts-soft
Täusche ich mich, oder sind sämtliche Projekte eingestellt/deaktiviert?
Das wohl nicht, aber nicht unbedingt Sinnvoll, da es jetzt ja Module gibt, die ähnliches leisten, fast.

Da ist OOP wohl noch unpupulärer als es vorher bereits war, vor allem bei Einsteigern.

Gruß
Thomas

Re: OOP Precompiler

Verfasst: 19.02.2017 13:21
von mk-soft
ts-soft hat geschrieben:
Da ist OOP wohl noch unpupulärer als es vorher bereits war, vor allem bei Einsteigern.
Da muss ich Thomas recht geben. Mit der Einführung von Modulen sinn einige Sachen einfacher geworden. Ich selber bin von OOP-Precompiler auf Modul mit OOP Funktionen umgestiegen (Siehe Link).

Aber je nach Anwendungsfall macht es sinn auch ein Object (OOP) zu programmieren. Dazu finde ich aber die PB-Hilfe was ein Objekt ist und wie dieses zu verwenden ist nicht ausreichend.

Manche OOP Implementierung bauen eine komplette neu Syntax für PB auf, was auch gut umgesetzt ist. Ich selber mag es lieber an die Syntax von PB zu halten, wo man auch sehr gut mit Objekten arbeiten kann.

Bei kleinen Projekten sollte man die Objekte komplett selber mit Module programmieren...

Hier mal ein Beispiel wie man mit Modulen rechts einfach Objekte programmieren kann

Code: Alles auswählen

; Module OOP Example by mk-soft

DeclareModule MyObject
  
  Interface iMyObject
    Release()
    Clear()
    Add(Value.i)
    Sub(Value.i)
    Result()
    ResultS.s()
  EndInterface
  
  Declare New(Startwert = 0)
  
EndDeclareModule

Module MyObject
  
  EnableExplicit
  
  ; Objektdaten
  Structure sMyObject
    *vTable ; Immer als erster Eintrag. Systemregel
    summe.i
  EndStructure
  
  ; Object anlegen
  Procedure New(Startwert = 0)
    Protected *object.sMyObject
    *object = AllocateStructure(sMyObject)
    If *object
      ; Virtuelle Funktionstabelle zuweisen
      *object\vTable = ?vMyObject
      ; Daten zuweisen
      *object\summe = Startwert
    EndIf
    ProcedureReturn *object
  EndProcedure
  
  ; Object freigeben
  Procedure Release(*this.sMyObject)
    FreeStructure(*this)
    ProcedureReturn 0
  EndProcedure
  
  ; Object funktionen
  Procedure Clear(*this.sMyObject)
    With *this
      \summe = 0
    EndWith
  EndProcedure
  
  Procedure Add(*this.sMyObject, Value.i)
    With *this
      \summe + Value
    EndWith
  EndProcedure
  
  Procedure Sub(*this.sMyObject, Value.i)
    With *this
      \summe - Value
    EndWith
  EndProcedure
  
  Procedure Result(*this.sMyObject)
    With *this
      ProcedureReturn \summe
    EndWith
  EndProcedure
  
  Procedure.s ResultS(*this.sMyObject)
    With *this
      ProcedureReturn "Result = " + Str(\summe)
    EndWith
  EndProcedure
  
  ; Funktionstabelle. Gleiche Reihenfolge wie das Interface
  DataSection
    vMyObject:
    Data.i @Release()
    Data.i @Clear()
    Data.i @Add()
    Data.i @Sub()
    Data.i @Result()
    Data.i @ResultS()
  EndDataSection
  
EndModule

; Test
Define.MyObject::iMyObject *obj1, *obj2
*obj1= MyObject::New()
*obj2= MyObject::New(100)
*obj1\Add(10)
*obj2\Sub(10)
Debug *obj1\Result()
Debug *obj2\ResultS()
*obj1\Release()
*obj2\Release()

Re: OOP Precompiler

Verfasst: 19.02.2017 19:43
von jensknaack
Hallo und herzlichen Dank für die Antworten.

Die muss ich jetzt erst einmal durcharbeiten und verstehen.

Ich hatte als Mangel empfunden, dass ich bei der Lösung Interface mit "darunterliegender" Struktur nicht auf die einzelnen Felder/Properties (wie auch immer das richtig in PB genannt wird) zugreifen kann, sondern alles mit Prozeduren erledigen muss. Aber offensichtlich kann dieses Problem gelöst werden, indem ich mir mit einer Prozedur den Zeiger auf die Struktur geben lasse.

Viele Grüße
Jens