Zugriff Child Class auf Parent Class ? [erledigt]

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Zugriff Child Class auf Parent Class ? [erledigt]

Beitrag von AUGE_OHR »

hi,
gedacht sei folgende Konstruktion

Code: Alles auswählen

CLASS AAA
 PROTECTED:
   VAR z1
 EXPORTED :
   CLASS VAR x1 SHARED
   VAR x2 
 INLINE METHOD Init()
 INLINE METHOD Create()
 INLINE METHOD Add()
   LOCAL oXbp 
   oXbp := BBB():NEW(self)
   oXbp:y1 := ::x1
   oXbp:y2 := ::x2 
   oXbp:y3 := ::z1 
   oXbp:CREATE()
   AADD(::alleBBB,oXbp)
   oXbp:Machmal(::x1,::x2,::z1)     // hm ... ???
   ...
 RETURN oXbp
 INLINE METHOD CallfromBBB(x)
   ...
 RETURN ::z1                    // hm ... ???  
ENDCLASS

CLASS BBB
 EXPORTED :
   CLASS VAR Y1 SHARED
   VAR Y2 
   VAR Y3 
 INLINE METHOD Init(oParent)
   ::oParent := oParent
 INLINE METHOD Create()
 INLINE METHOD Machmal(a,b,c)
 x := a
 x := b
 x := c
 x := ::y1
 x := ::y2
 x := ::y3
 x := ::oParent:x1
 x := ::oParent:x2
 x := ::oParent:z1 -> crash

 x := ::oParent:CallfromBBB(x)  // ???

 RETURN NIL
ENDCLASS
Wenn ich in Class AAA die Class BBB anlege komm ich ja an die EXPORTED von BBB ran

Frage : wie komme ich aus Class BBB an die Class VAR / iVar von Class AAA (richtig) ran ?

... em ... äh ... was ist der Unterschied von einer Class Var vs. iVar ?

---

die Class Var / iVar x1,x2 sind EXPORTED d.h. ich "könnte" aus Class BBB zugreifen während ich an die PROTECTED z1 nicht ran komme.
nun stehen beid CLASSen im selben PRG ... gibt es sowas wie eine "Fieldwide" STATIC CLASS Ivar oder STATIC Method ?
Zuletzt geändert von AUGE_OHR am Mo, 23. Feb 2015 9:30, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Zugriff Child Class auf Parent Class ?

Beitrag von georg »

Guten Morgen, Jimmy -


grundsätzlich wird eine CLASS VAR nur einmal angelegt, unabhängig davon, wie viele Objekte Du von einer Klasse erzeugst.

Ansonsten, wenn Du Zugriff auf PROTECTED CLASS/iVARs benötigst, empfiehlt es sich doch eher, die zweite Klasse von der ersten abzuleiten. Dein Parent-Bezug ist doch nur dadurch gegeben, dass Du die "Parent"-Klasse als Parameter mitgibst.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Zugriff Child Class auf Parent Class ?

Beitrag von AUGE_OHR »

hi,
Danke für deine Antwort
georg hat geschrieben:grundsätzlich wird eine CLASS VAR nur einmal angelegt, unabhängig davon, wie viele Objekte Du von einer Klasse erzeugst.
wenn ich eine ImageList als CLASS VAR in BBB anlege dann könnten alle BBB Childs auf die "selbe" ImagelList zugreifen ?
... bislang habe ich die in der CLASS AAA verwaltet.
georg hat geschrieben:Ansonsten, wenn Du Zugriff auf PROTECTED CLASS/iVARs benötigst, empfiehlt es sich doch eher, die zweite Klasse von der ersten abzuleiten. Dein Parent-Bezug ist doch nur dadurch gegeben, dass Du die "Parent"-Klasse als Parameter mitgibst.
PROTECTED weil nicht von "aussen" darauf zugegriffen werden soll ... aber "innerhalb" des selben PRG von der CLASS BBB hätte ich es schon gerne.

Das ich eine CLASS AAA und eine Child CLASS BBB habe liegt an der OOP Syntax wie Alaska die XbParts : XbpStatusbar/Panel oder XbpToolbar/Button definiert hat.

wenn ich per Parameter übergebe ist alles klar

Code: Alles auswählen

   oPanel := AAA():New():Create()
   oPanel:Add(cCapition,xImage,nStyle ...)
ich kann dann einzeln die Parameter bearbeiten und die API Befehle senden

Code: Alles auswählen

   nRet := @user32:SendMessageA(::hStatusBar,SB_SETTEXT ,MakeLParam(nNo-1,nBevel),cCaption ) // Zero-based
   nRet := @user32:SendMessageA(::hStatusBar,SB_SETICON, nNo-1, HIcon ) // Zero-based
   DO CASE
      CASE nStyle = XBPSTATUSBAR_PANEL_CAPSLOCK
      CASE nStyle = XBPSTATUSBAR_PANEL_NUMLOCK
      CASE nStyle = XBPSTATUSBAR_PANEL_INSERT
      CASE nStyle = XBPSTATUSBAR_PANEL_SCROLL
      CASE nStyle = XBPSTATUSBAR_PANEL_DATE
      CASE nStyle = XBPSTATUSBAR_PANEL_TIME
   ENDCASE
nun macht es Alaska gerne so

Code: Alles auswählen

   oPanel := AAA():New():Create()
   oBBB := oPanel:Add()  // "leer" - oBBB ist der Rückgabewerte
   oBBB:Capition := cCapition
   oBBB:Image    := xImage
   oBBB:Style    := XBPSTATUSBAR_PANEL_TIME
deshalb muss ich, bei meinem bisherigen Desgin, von der CLASS BBB auch Zugriff auf den Parent AAA haben denn sonst habe ich damit

Code: Alles auswählen

 INLINE ASSIGN METHOD _caption(xValue) VAR caption
 LOCAL nRet := 0
 LOCAL nNo  := ::index

   IF PCOUNT() > 0
      IF VALTYPE(xValue) = "C"
         ::caption := xValue
         IF NIL <> nNo
            nRet := @user32:SendMessageA(::hStatusBar,SB_SETTEXT ,nNo-1, xValue )
 ::Ondummy("caption",nNo,xValue,nRet)
         ENDIF
      ENDIF
   ENDIF
 RETURN ::caption
ein Problem aber das ist ein anderes Thema.
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Zugriff Child Class auf Parent Class ?

Beitrag von georg »

Hallo, Jimmy -


Zitat aus der Dokumentation:
The declaration CLASS VAR is used within the class declaration (between the CLASS...ENDCLASS statements). It declares a member variable as a class variable. A class variable is a member variable of the class object and it exists only once per class. Its value is the same for all instances of the class. When an instance of the class (an object) receives the message for a class variable, it forwards the message on to a class object.
Ich verstehe das vereinfacht so, dass es die CLASS VAR nur einmal gibt. Sie "existierst" nur einmal, und wenn Du in einer beliebigen Instanz einer Klasse den Wert der CLASS VAR änderst, gilt diese Änderung für alle Instanzen dieser Klasse.


Was Dein anderes Problem angeht: PROTECTED bezieht sich auf Klassen und nicht auf Programm-Quellen (der Vergleich zu STATIC hilft da nicht weiter und würde auch dem Gedanken der objektorientierten Programmierung widersprechen).

Ich verstehe die Parent()-Beziehung so, dass hier eine Vererbung stattfinden muss, damit von einem Parent gesprochen werden kann.

Dein Vorgehen erinnert mich da eher an einen Kuckuck, der einem anderen seine Eier unterschiebt: da greift keine Vererbung.

Eine Vererbung findet dann statt, wenn eine Klasse von einer (oder mehreren) anderen abgeleitet wird. DANN kannst Du über self:OberKlasse():MeineProtectedIVar auch auf eine PROTECTED iVAR MeineProtectediVar von OberKlasse() zugreifen. Du greifst über die übergeordnete (vererbende) Klasse zu (darum auch die Klammern nach dem Namen der Klasse) und nicht über eine iVar.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Zugriff Child Class auf Parent Class ?

Beitrag von AUGE_OHR »

hi,

JA ... die CLASS VAR hat schon viel gebracht aber ich muss noch den Rest umstellen.

bei alten Design von DXE_Statbar() hatte ich nur eine Class vorgesehen ... wozu noch "extra" Panel wenn ein Array reicht.
im Prinzip war es sogar schneller und besser weil ich den benötigten Speicher "im Stück" anforden kann um die API Befehle auszuführen.

da ich nun die DXE Control kompatibler machen will habe ich also auf das Alaska Konzept umgestellt ... aber vieles ist noch in der AAA.
tatsächlich benötige ich wohl nur das Handle (::hStatusbar) von AAA für die API Befehle und kann den ganzen Rest nach BBB verlegen.

ok, wieder was gelernt, Danke !
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Zugriff Child Class auf Parent Class ? [erledigt]

Beitrag von AUGE_OHR »

hi,

jetzt habe ich doch noch eine Frage wegen CLASS VAR : wann / wo "lösche" ich die ?

wenn ich das Handle einer Imagelist, welche für alle Childs, die Images bereitstellt habe darf ich die ja nicht löschen so lange ich ein Child habe. Erst nach dem letzten oChild:Destroy() dürfte ich

Code: Alles auswählen

IF NIL <> ::hImageList2
   @comctl32:ImageList_Destroy(::hImageList2)
ENDIF
schreiben ... aber wie bekomme ich das hin ?
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Zugriff Child Class auf Parent Class ? [erledigt]

Beitrag von georg »

Hallo, Jimmy -


dann brauchst Du eine Methode :childList() - und wenn deren Rückgabewert ein leeres Array ist, dann kannst Du die CLASS VAR auf NIL zurücksetzen (oder was immer sinnvoll ist).
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Zugriff Child Class auf Parent Class ? [erledigt]

Beitrag von AUGE_OHR »

georg hat geschrieben:dann brauchst Du eine Methode :childList()
aber eine o:Childlist() müsste ich doch vom Parent abfragen ...
georg hat geschrieben: - und wenn deren Rückgabewert ein leeres Array ist, dann kannst Du die CLASS VAR auf NIL zurücksetzen (oder was immer sinnvoll ist).
hm ... eine weite CLASS VAR als Array wo die Child Objecte drin sind ...
ok, Danke das werde ich mal versuchen.
gruss by OHR
Jimmy
Antworten