Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Sub class <-> Parent class (https://www.delphipraxis.net/41319-sub-class-parent-class.html)

Skyrunner2 1. Mär 2005 15:40


Sub class <-> Parent class
 
hallo!
ich habe eine haupt klasse, und hab nun eine unter klasse erstellt

Type ChildClass=class(ParentClass)


wenn ich nun in einem form test vom typ ParentClass habe, und durch functionen Private Variablen in dieser klasse definiere, ist es dann möglich auf diese privaten variablen über die Child Class zu zugreifen? wenn ja, wie?


also noch mal anders:
Delphi-Quellcode:
Type Parent=Class
      Private
        PrivateVAR:Integer;
       Public
         Procedure ChangePrivateVar(NewValue:Integer);
       end;

       Child=Class(Parent)
        Public
          Function ReadParentPrivateVar():Integer;
         end;

//[...]

Var TestParent:Parent;
    TestChild:Child;

begin
//[... create...]
// dann:

TestParent.ChangePrivateVar(5);

TestChild.ReadParentPrivateVar;//-> Sollte 5 ausgeben...

Ich denke ich muss irgentwie TestChild mit Test Parent verknüpfen... doch wie, und ist das überhaupt möglich??

Skyrunner2 1. Mär 2005 15:42

Re: Sub class <-> Parent class
 
eine spontane idee wäre TestChild unter Parent -> Private unterzubringen... gut/schelcht? bzw geht das so wie ich will? - TestChild würde dann im haupt prog wegfallen..

Vjay 1. Mär 2005 15:52

Re: Sub class <-> Parent class
 
Dafür ist soweit ich weiss der protected - Teil zuständig.

Skyrunner2 1. Mär 2005 15:57

Re: Sub class <-> Parent class
 
:?: :gruebel:

*/ geht in Delphi help suchen /*

wsn dös?

Muetze1 1. Mär 2005 15:59

Re: Sub class <-> Parent class
 
Moin!

Private Abschnitt definiert Methoden/Werte die nicht von aussen sichtbar sind und auch in Ableitungen nicht (Einschränkung: Friend-Funktionalität von Delphi bei Klassen in gleicher Unit). Für die Funktionalität wie in deiner Frage beschrieben, ist der Protected Abschnitt zuständig - von aussen nicht sichtbar, in den Ableitungen schon.

MfG
Muetze1

Skyrunner2 1. Mär 2005 16:13

Re: Sub class <-> Parent class
 
hmm aber die verknüpfung der eigentlichen variablen ist nocht nicht "vollständig"


wenn ich do jetzt auf TestChild.ReadParentPrivateVar zugreife, kann ich zwar PrivateVAR bzw ProtectedVAV "sehen" aber in diesem falle wäre diese variable doch nicht die selbe auf die TestParent.ChangePrivateVar(NewValue:Integer); zugreift, oder?

da ja TestParent, und TestChild zwar über den klassen typen zusammen hängen, aber nicht im sinne vom eigentlichen wert der variablen...


TestChild und TestParent ist doch quasi wie:


A:Record
Bla:Bla;
I:integer;end;
B: Integer;

wobei A und B Zwar von der klassen definition her irgentwie zusammen hängen, aber troz dem ist A.i nicht gleich B...


Problem ist also: Wie kann icht A & B, bzw TestParent und TestChild miteinander verknüpfen?

Muetze1 2. Mär 2005 00:56

Re: Sub class <-> Parent class
 
Moin!

Du hast 2 Variablen und legst damit wohl auch 2 Instanzen an. Daher verhält es sich doch so, das jede Instanz beim anlegen mit dem Constructor ihren eigenen Speicherplatz (und Variablenspeicherplatz) bekommt. Eine Klasse implementiert nur Verhalten und Code - der dann so oft benutzt werden kann wie benötigt - er kann so oft instanziiert werden wie nötig. Auch die Variablen: Die Klasse arbeitent mit ihnen in ihren Code - hat aber keinen Speicherplatz - dieser wird erst beim anlegen der Klasse zugewiesen und dann arbeitet der Code mit den dortigen Variablen. Instanziierst du die Klasse nochmals, dann arbeitet die 2. Instanz auch mit den gleichen Variablen - da es die gleiche Klasse = gleiche Variablen - ABER andere Position im Speicher und somit auch unabhängiger Inhalt.

Eine Klasse ist wie ein Stempel - sie bietet dir ein festes Muster. Wie oft und vor allem wo du jetzt die Klasse hineindrückst oder draufdrückst um das Muster zu erhalten ist deine Sache. Du kannst den "Stempel" am Strand an x-beliebigen Positionen stempeln und genausogut in Mutti's leckerer Griesssuppe...

Das Muster ist gleich - die Lage und die Ränder, Bezugspunkt, geographische Ausrichtung etc ist von jedem Muster anders.

Delphi-Quellcode:
Type
  TObjectParent = Class
  Protected
    a : Integer;

    Procedure SetzeAZurueck;

  Public
    Procedure SetzeA(Const NewA: Integer);
    Function AMal10: Integer;
  End;

  TObjectChild = Class(TObjectParent)
  Protected
    b : Integer;

    Procedure SetzeBeideZurueck;
  Public
    Procedure SetzeB(Const NewB: Integer);
    Function SummAB: Integer;
    Function Summ10A_10B: Integer;
  End;

....

Procedure TObjectParent.SetzeAZurueck;
Begin
  A := 0;
End;

Procedure TObjectParent.SetzeA(Const NewA: Integer);
Begin
  A := NewA;
End;

Function TObjectParent.AMal10: Integer;
Begin
  Result := A;
End;

  // Child

Procedure TObjectChild.SetzeBeideZurueck;
Begin
  SetzaAZurueck;   // A und deren Methode hat diese Klasse geerbt
  B := 0;
End;

Procedure TObjectChild.SetzeB(Const NewB: Integer);
Begin
  B := NewB;
End;

Function TObjectChild.SummAB: Integer;
Begin
  Result := A + B;
End;

Function TObjectChild.Summ10A_10B: Integer;
Begin
  Result := AMal10 + B * 10;
End;
Ich hoffe das wird klarer bzw. trifft das Problem.

Ansonsten wenn du wirklich den Wert von A einer Instanz von TObjectParent haben willst, dann ist doch die Frage von welcher TObjectParent Instanz? Du kannst doch so viele Instanzen anlegen bis der Speicher überquillt - daher: den Wert der Variablen A von welcher Instanz sollte er denn nehmen/nutzen um ihn dir zurück zu geben?

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz