AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Überschreiben von Feldern in OOP

Ein Thema von mojo777 · begonnen am 8. Mai 2007 · letzter Beitrag vom 10. Mai 2007
Antwort Antwort
mojo777

Registriert seit: 10. Sep 2003
402 Beiträge
 
#1

Überschreiben von Feldern in OOP

  Alt 8. Mai 2007, 08:03
Hallo Leute,

habe momentan ein Problem mit der Vererbung.

Das Ziel ist es, z.b. Produkte, Warengruppen, Kunden, etc... als Objekte darzustellen, welche in einer Datenbank gepsichert sind.

Habe hierfür ein Minimalbeispiel erstellt. Statt viel rumzuschreiben, hier Bild:
http://pilaf.ath.cx/pub/shared_pics/klassen_1.gif

So. Ich will die Methode getPointerByUid in TItemListe implementieren, damit ich den selben Quatsch nicht 1000 mal tippen muss.
Diese Mthode sähe in TItemliste so aus:
Delphi-Quellcode:
function TItemListe.getPointerByUid(uid:Integer):Pointer;
  var i:INteger;
  begin
  for i:=1 to self.Count do
    begin
    if self.Liste[i-1].uid=uid then
      begin
      Result:=@self.Liste[i-1];
      exit;
      end;
    end;
  raise ERangeError.Create('Kein ItemListeneintrag gefunden! '+#13+'UID: '+IntToStr(uid));
  end;
Dabei sieht die TProdListe.Add methode so aus:

Delphi-Quellcode:
procedure TProdListe.add(bez:String; preis:Double; (...));
var i:Integer
begin
i:=length(self.Liste);
setLength(self.Liste, i+1);
self.Liste[i]:=TProdukt.Create(bez, preis, (...));
end;
Nun das Problem:

Wenn die Procedure getPointerByUid in TItemListe läuft, greift diese auf die Liste, deklariert in TItemliste zu. Das ist bad! Diese ist natürlich leer.


Sicherlich hat sich der eine oder andere mit diesem Modellproblemen schon beschäftigt. Wie macht ihr das?
Wäre für Vorschläge aller Art sehr dankbar!

Gruß!
Muh macht die kUh
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.640 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Überschreiben von Feldern in OOP

  Alt 8. Mai 2007, 08:55
1. würde ich mir überlegen, anstatt TList vielleicht TObjectList zu verwenden, dann hört die Pointerschieberei auf und die Typen sind etwas sicherer.

2. würde ich TItemList nicht mit TProduktList erweitern, sondern TProduktList von TTitemList ableiten. So sparst Du Dir die Eigenschaft Liste und kannst direkt darauf zugreifen.

3. TProdukt von TItem ableiten, so hat TProduct eine uid und kann bei der Suche nach selbigem benutzt werden.

Delphi-Quellcode:
function TItemListe.getPointerByUid(uid:Integer):TItem;
  var i:INteger;
  begin
  Result := nil;
  for i:=0 to Count-1 do
  if Items[i].uid=uid then
  begin
    Result:=Items[i];
    break;
  end;
  if Result = nil then
    raise ERangeError.Create('Kein ItemListeneintrag gefunden! '+#13+'UID: '+IntToStr(uid));
end;

rocedure TProdListe.add(bez:String; preis:Double; (...));
var i:Integer
begin
  Add(TProdukt.Create(bez, preis, (...)));
end;
Sven Harazim
--
  Mit Zitat antworten Zitat
mojo777

Registriert seit: 10. Sep 2003
402 Beiträge
 
#3

Re: Überschreiben von Feldern in OOP

  Alt 10. Mai 2007, 00:25
hi sh17,
habe nicht sofort antworten können. musste ein wenig rumexperimentieren.

habe ersteinmal deinen ersten tipp ausprobiert.
stoße dabei aber auf schwierigkeiten.

habe nun die Funktion getPointerByUid(uid:Integer) umgeschrieben und
der Rückgabewert ist nun
Result:=self.Liste.List[i-1]; wobei Liste:TobjectList
es wird auch ein Pointer zurückgegeben.
ich kann ihn aber nicht typisieren.

beim Aufruf
Delphi-Quellcode:
(...)
_prod:^TProdukt;
begin
_prod:=produkte.getPointerByUid(1);
showmessage(_prod.name);
end;
kommt ein access violation...
ich brauche aber unbedingt den pointer zu diesem objekt. sonst laufen die berechnungen alle durcheinander...


würde mich freuen, wenn du mir auch hier ein paar tipps geben könntest.
werde bald sobald ich ein bisschen zeit habe auch mal die anderen möglichkeiten genauer anschauen.

danke schon jetzt!

Gruß

EDIT:
hmmm.. habs glaub ich mit
Delphi-Quellcode:
function TItemListe.getPointerByUid(uid:Integer):Pointer;
  var i:INteger;
  erg:TItem;
  begin
  for i:=1 to self.Liste.Count do
    begin
    if (self.Liste.Items[i-1] as TItem).uid=uid then
      begin
      erg:=(self.Liste.Items[i-1] as TItem);
      Result:=@erg; // Items[i-1] as TItem);
      exit;
      end;
    end;
  //Result:=nil;
  raise ERangeError.Create('Kein ItemListeneintrag gefunden! '+#13+'UID: '+IntToStr(uid));
  end;
hinbekommen... muss ich aber etwas genauer testen ob ich mit dem pointer doch nicht auf kopierte instanzen zugreife....
Muh macht die kUh
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#4

Re: Überschreiben von Feldern in OOP

  Alt 10. Mai 2007, 09:16
Hallo,
Zitat von mojo777:
ich brauche aber unbedingt den pointer zu diesem objekt. sonst laufen die berechnungen alle durcheinander...
Bist Du Dir sicher, dass Du einen Pointer auf ein Objekt brauchst? Objekte sind doch schon Pointer.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
mojo777

Registriert seit: 10. Sep 2003
402 Beiträge
 
#5

Re: Überschreiben von Feldern in OOP

  Alt 10. Mai 2007, 18:46
Zitat:
Objekte sind doch schon Pointer.
Hmmm.. hab mir auch gerade ein Objekt zurückgeben lassen...
hat eigentlich alles funktioniert...
nur irgendwie bin ich dennoch noch ein wenig unsicher....
bei meinen verketteten Listen hatte ich probleme mit rückgabe in form von ganzen Objekten...

die welt ist manchmal echt ein rätsel

also in c++ wird definitiv eine kopie von (primitiven zumindest) werten zurückgegeben.. in java referenz.... ich blick da langsam nicht mehr so ganz druch...

hätte vielleicht jemand für mich einen link, wo ich die "grundlagen" von pascal nachlesen könnte?


danke
Muh macht die kUh
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Überschreiben von Feldern in OOP

  Alt 10. Mai 2007, 18:48
Objkete in Delphi sind Referenzen (also Zeiger). bei primitiven typen kommt es an, wie die Prozeduren/Funktionen deklariert sind.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: Überschreiben von Feldern in OOP

  Alt 10. Mai 2007, 19:05
Zitat von mkinzler:
Objkete in Delphi sind Referenzen (also Zeiger). bei primitiven typen kommt es an, wie die Prozeduren/Funktionen deklariert sind.
Bei Objektparametern kommt es genauso darauf an. Mit var oder out sind diese keine Referenzen auf Instanzen mehr, sondern Referenzen auf Referenz - ein ebenso wichtiger Unterschied wie bei Value-Types.

@mojo: Wertetypen sind grundsätzlich und sprachenunabhängig alle Typen, die auf dem Stack liegen (bei Referenztypen landet stattdessen nur die Adresse als Int auf dem Stack, die Daten liegen auf dem Heap). Bei Pascal wären das primitive Typen, Records, statische Arrays und Rücksprungadressen ^^; in einem speziellen, nicht gerade oft wichtigen Sinne auch Methodenzeiger . Strings sind zwar Referenzen, verhalten sich aber wie Wertetypen.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
mojo777

Registriert seit: 10. Sep 2003
402 Beiträge
 
#8

Re: Überschreiben von Feldern in OOP

  Alt 10. Mai 2007, 19:34
Zitat:
Mit var oder out sind diese keine Referenzen auf Instanzen mehr, sondern Referenzen auf Referenz - ein ebenso wichtiger Unterschied wie bei Value-Types
ok. das bestätigt mein "empirisches" wissen

danke!
ich habs nun hinbekommen ohne viel code umschreiben zu müssen und dennoch eine elegante lösung zu benutzen!
Muh macht die kUh
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:24 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