WinFuture-Forum.de: Smalltalk - WinFuture-Forum.de

Zum Inhalt wechseln

Beiträge in diesem Forum erhöhen euren Beitragszähler nicht.
  • 11895 Seiten +
  • « Erste
  • 11800
  • 11801
  • 11802
  • 11803
  • 11804
  • Letzte »

Smalltalk Guten Morgen, Guten Tag, Guten Abend Kaffeeklatsch

#177016 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 06. Juni 2017 - 22:41

Man muß da, laut Tutorial nur irgendwas runterladen (Link war dazu) in drei oder vier Dateien ein paar Anpassungen machen (Da steht dann aber nur »Ändern Sie blub in blab« aber leider nicht in welcher Datei oder »A und B muß gegebenenfalls angepasst werden« aber es steht nicht wann der Fall gegeben ist und wie die Anpassungen aussehen muß) und am Ende muß man ein Perlscript aufrufen. Das soll dann ein paar Stunden dauern und dann ist die statische Version fertig.

Also im Prinzip will ich das gar nicht so unbedingt mit dem statischen Linken. Sieht ja auch viel professioneller aus, wenn im Programme-Ordner nach der Installation ein bißchen was drin ist. Mir würde ja reichen, wenn mir die Umgebung sagt, welche DLL ich mitgeben muß. Wenn die die Eintäge in diese Linkliste macht, müßte das doch bekannt sein.

Ansonsten habe ich VS (für 64bit Anwendungen) und MinGW (für 32bit Anwendungen).

Dieser Beitrag wurde von Holger_N bearbeitet: 06. Juni 2017 - 22:47

Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.

Anzeige



#177017 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 06. Juni 2017 - 22:46

Klingt seltsam. Aber, gut, wer weiß wie die das bei Qt jetzt handhaben. Mit syncqt seh ich eh nicht durch, was das soll. Insbesondere, weil es nicht funktioniert, außer vielleicht unter *nix & co. :/

Ansonsten hast Du zwar nicht ganz unrecht, aber am Ende des Tages ist die statische Lösung... nicht immer, aber oft die professionellere. Sie ist robuster und sie ist weniger malware-anfällig, weil Funktionen nicht zur Laufzeit eingebunden werden.

Wie Du's am Ende vertreibst ist ja egal. Wichtig ist nur, daß es richtig funktioniert, und da nimmt sich das alles nix.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild

#177018 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 06. Juni 2017 - 22:57

Das ist auch alles nur so halb erlaubt. Also es steht ja nirgends genau. Auf der Qt-Seite ist alles soweit nur in Englisch und juristische Texte versteht man ja schon in seiner Muttersprache nur halb, da nutzt einem eine Übersetzung vom Englischen ja dann nichts. Die ist dann ja nochmal doppelt so ungenau. Jedenfalls die meisten Übereinstimmungen gab es bei der Ausführung, dass die statische Variante eigentlich der kommerziellen Version vorbehalten ist, inzwischen wird das auch bei der Free-version geduldet, man muß dann aber zusätzlich den Quellcode offenlegen. Wobei das aber bei Programmen, die man kostenlos verteilt insgesamt nochmal sehr entspannt gesehen wird.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.

#177019 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 07. Juni 2017 - 08:07

Aha. Na gut, mit dem Lizenzmodell von Qt hab ich mich noch nie auseinandersetzen müssen, gottseidank. War nur einmal in deren Foren unterwegs, als es noch Nokia war. Und die haben sich dort alles angeeignet per AGB: "Was Du hier schreibst, geht in unseren Besitz über, insbesondere, falls Geheimnisse oder Algorithmen zur Problemlösung gepostet werden sollten. Das ist nicht einklagbar." oder so ähnlich.

Hab ich denen den Vogel gezeigt.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild

#177020 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 07. Juni 2017 - 14:12

Für das, was ich im Moment mache, weiß ich ja zumindest schonmal bescheid, was ich brauche. Ich glaube son paar allgemeine Grundlagen wären erstmal besser, also der 84. Versuch Klassen zu verstehen und was das mit dem new und den Zeigern auf sich hat. Also ich benutze das ja alles aber ich weiß nicht warum.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.

#177021 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 07. Juni 2017 - 14:36

Pointer? Oje, die hab ich immer gehaßt und werde sie auch immer hassen. :ph34r:

Mit OO braucht man die aber eigentlich nicht. Da kümmert der sich normal selber drum.

Ansonsten:

- Gibt es eine Klasse Mensch.
- Und daraus kann man einen Holger bauen.
- Der ist, per Unterstellung, männlich.
- Also ist Mensch Holger = new Mensch(Mensch.MALE);
- Das new() ist also dafür da, einen konkreten Holger in die breite Masse zu setzen. Menschen als solche gibt es nicht; nur Instanzen solcher, nämlich Holger, Holger, Holger und Holger. Außerdem Bruce und Sheila. Und die sind auch keine Menschen (zu abstrakt mangels Info zum Geschlecht) sondern bestenfalls noch männliche Menschen und weibliche Menschen.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild

#177022 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 07. Juni 2017 - 16:06

Naja ich kann ein einfaches Label machen mit:

QLabel labelBlub ;
label.setGeometry(10,10,100,20);



und dann habe ich an der Stelle ein Label oder ich mache das mit new und Zeiger und Pi Pa Po und habe mit:


QLabel *labelBlub = new QLabel();
labelBlub->setGeometry(10,10,100,20);


aber auch nur ein Label an der Stelle. Nun bin ich mir sicher, dass für ein einfaches Label, was einfach nur die ganze Zeit an einer Stelle ist und immer dasselbe Wort anzeigt, die erste Variante am einfachsten ist und völlig ausreicht und dass aber mit der zweiten Variante viele Sachen möglich sind. Ich habe nun haufenweise Labels in meinem Programm und denke ich könnte da eine Menge vereinfachen, wenn ich das mit dem new verstände, also wozu das gut ist. Wenn ich nun bei 10 Elementen von irgendwas nur 1/10 der Tipparbeit habe, weil das alles von der selben Klasse abgeleitet wird und ich dasselbe nur mit anderen Parametern 10 mal neu aufrufe, dann macht das erstmal Sinn. Wenn ich aber 10 Elemente als einzelne Sachen schreibe und dazu auch nur eins wirklich tippen muß und die anderen 9 kopiere und ein paar Werte ändere, hab ich ja mit der Klasse nicht wirklich was gewonnen. Im Gegenteil, man hat bei Letzterem sogar einen besseren Überblick, weil man jedes Element schön als Textblock im Code vor sich hat und weiß, was was ist.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.

#177023 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 07. Juni 2017 - 19:03

Puijuijui – fass noch anne Kinnersichrung vonne Rakipulle scheitert *hicks* abba ging denn doch. Ischa man n beten kniffelich so mittn Schwunk.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.

#177024 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 09. Juni 2017 - 21:04

So und nun ist der Großteil von meinem Medikamenten Planer Pro-Version fertich. Fehler abfangen ist ja um Längen umfangreicher als das eigentliche Programm. Da kommt ja ganz schön was zusammen.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.

#177025 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 19. Juni 2017 - 15:52

Beiträge selber löschen ging nicht wa? Also irgendwie habe ich schon ein gewisses Mitteilungsbedürfnis aber ich will auch nicht Beitrag an Beitrag hängen. Editiere ich meinen letzten Beirag, sieht man aber in der Übersicht nicht, dass hier etwas Neues steht. Nun wollte ich meine letzten Beiträge zusammenkopieren und dann einen neuen Beitrag schreiben. Geht aber nicht, das ist schade.


Na egal, aber ich glaube ich habe jetzt die Klassen verstanden. Also meine aktuelle Vermutung:

Ich brauche ein Label um irgendwas zu beschriften und habe dann (in Qt) dafür das QLabel und kann das dann in meinem Fenster platzieren.

QLabel labelName ;
labelName.setParent(this);
labelName.setGeometry(10,10,100,20);



Nun könnte ich mir für eine einfache Tabelle beispielsweise 5x3 von diesen Labels entsprechend über- und nebeneinander platzieren, was einmalig wahrscheinlich auch ginge. (Unabhängig davon, dass es fertige Tabellen auch gibt. Aber mal angenommen es gäbe keine) Brauche ich aber die Tabelle öfter, wäre es recht umständlich, diese Label-Konstruktion zu kopieren und immer wieder anzupassen.

Nun könnte ich mir eine Klasse basteln, die aus den Labels so eine Tabelle bastelt und ich könnte die Eigenschaften einbauen, die ich will und für meine Tabelle brauche. Und dann erstelle ich noch eine Konstruktionsvorschrift. Die Klasse nenne ich dann QLabelBelle und kann mit:

QLabelBelle labbellName;
labbellName.setParent(this);
labbellName.setGeometry(10,10,100,20);
labbellName.setSize(5,3);

einfach diese Tabelle erstellen. Funktioniert das vom Schema her so?
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.

#177026 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 19. Juni 2017 - 17:40

Tabelle aus Labels? :unsure: Klingt irgendwie umständlich.

Ansonsten geht das erstmal. Du mußt halt nur schauen, daß Du die erforderlichen Parameter a) übergeben und b) ausgewertet bekommst.

Braucht mal bei Qt kein new() an dieser Stelle? Keine Ahnung, aber ich bau es einfach mal mit ein und verweise darauf, daß ich mit Qt nicht die Erfahrung hab. Deswegen soll das Untenstehende auch anschaulich, aber kein Qt-Code sein. :)


public class QLabelTabelle
{
 private QLabel[] TabellenZellen;

 public QLabelTabelle(String[] strLabels)
 {
  TabellenZellen = new QLabel[]; // Array von QLabels
  TabellenZellen.Clear(); // Alle Einträge raus (falls welche vorhanden)

  foreach (strLabels AS Zelle) // gehe alle übergebenen Bezeichner durch
  {
    QLabel objZelle = new QLabel; // Neues Label
    objZelle.Text = Zelle; // Der Text für das QLabel
    objZelle.Geometry = new Rectangle(x1,y1,x2,y2); // Dimensionen des Labels; entweder hardcodiert, oder als Klasseneigenschaft, oder dem Konstruktor übergeben)
    objZelle.Position = .... // diese Zeile wird interessant, falls das Label zur Anzeige absolut positioniert werden muß und man das nicht einfach "hinten anhängen" kann. In diesem Fall muß hier ordentlich gerechnet werden mit den Rechteck-Koordinaten der umgebenden Zellen, damit die neue Zelle auch wirklich in einem 5x3-Raster angeordnet wird

 .... // Eventuell andere Initialisierungsaufgaben, wie zu verwendende Schriftarten/-größen/-farben/whatever

  TabellenZellen.Push(objZelle); // die neue Zelle in die Sammlung der im Objekt gelisteten Zellen aufnehmen
  }
 }
}



Das beschreibt mehr oder weniger grob die Klasse, die dann mit sowas wie
QLabelTabelle qlt = new QLabelTabelle(array('a','b',...));
angelegt werden kann.

Nicht vergessen, den Konstruktor ggf mit erforderlichen Parametern zu versehen, falls sich die einzelnen Zellen noch irgendwie anders unterscheiden sollen. Einen Point() als linke obere Startkoordinate übergeben ist zB eine gute Idee. Denkbar wäre auch, daß man einfach ein Rechteck übergibt, welches die überdeckende Fläche beschreibt: dann muß man nur noch sagen, es gibt 20 Zellen und es gibt ein Rechteck mit 600x600px und die Klasse würde die 20 Felder per Grenzwertprinzip möglichst optimal auf die Fläche verteilen.

Dieser Beitrag wurde von RalphS bearbeitet: 19. Juni 2017 - 17:42

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild

#177027 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 19. Juni 2017 - 19:16

Das war jetzt nur um das schematisch zu erklären was ich (momentan) unter Klassen verstehe. Zu schreiben, dass ich mir beispielsweise eine Anzeige für irgendwas basteln könnte mit einem Label, einem Fortschrittsbalken und einem Button zum zurücksetzen hätte die Erklärung nur zu kompliziert gemacht und x Labels als Tabelle anordnen ist leichter verständlich zu erklären und wenn man das basteln will, nur um das Prinzip zu begreifen, ist das auch einfacher wenn man da nicht acht unterschiedliche Elemente hat.

Das mit dem new weiß ich gerade nicht, weil ich das aus dem Kopf geschrieben hatte. Mal funktioniert es ohne, mal mit new und manchmal muß ein Sternchen ran. Ich probiere dann immer so lange bis es klappt. Ich habe da noch nicht das System erkannt das dahintersteckt.

Bei meinem letzten Streich mit den Anwesenheitsplaner aus dem Office-Thread habe ich es immerhin schon geschafft, dass ich nicht 12 Tabs mit 12 Tabellen erstellt habe, sondern sowohl die Tabs, als auch die Tabellen, werden in einer Schleife erstellt und ich mußte es nur einmal bauen. Nun war ich an einer Stelle, wo ich ein paar Labels hatte, die sich immer wiederholen und dann auch 10 mit einer Schleife hingekriegt usw. und dabei bin ich auf die Idee gekommen, dass da verschiedene Sachen über Klassen machen könnte, dazu muß ich aber wissen, ob Klassen auch das sind, was ich mir unter Klassen vorstelle. In PHP sind Klassen für mich ja nur Funktionen mit nochmal ne Klammer drum.

Ich war gerade kurz davor es hingekriegt zu haben aber dann ist doch irgendwo noch ein Fehler drin. ich habe hier drei Dateien, main.cpp, mainwindow.cpp und mainwindow.h und wenn man eine Klasse hinzufügt hat man noch mal dieklasse.cpp und dieklasse.h und wenn man sich dann Beispiele aus dem Netz sucht steht da ja nirgends, wo was hin muß. Wenn man es dann durch Probieren rausgekriegt hat, wird es ja oft logisch aber vorher sieht man da nicht durch.

Der Code selber, der dann die Tabelle konstruiert, der ist dabei ja das kleinste Problem. Das ist ja wieder logisch. Der Aufbau ist meine Sorge.

---------------------------


So wieder mal alles löschen, neu anfangen. Irgendwann kriege ich das schon raus.

Dieser Beitrag wurde von Holger_N bearbeitet: 19. Juni 2017 - 19:24

Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.

#177028 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 19. Juni 2017 - 20:58

Eine Klasse beschreiEbt eine Einheit und orientiert sich immer an dem, was Du willst oder brauchst. Es gibt Basisklassen, die zB an die Plattform gebunden sind, damit da auch was passiert und man das nicht selber machen muß (zB als Window-Klasse).

Ein Beispiel. Du hast eine Anwendung mit Tabs. Jedes Tab gehört aber zu einem Fenster(Dialogfeld); kein Dialogfeld ohne Tab und auch kein Tab ohne Dialogfeld.

Also würde man sich eine Klasse bauen myDialogFeld oder so ähnlich. Im Code der Klasse würde drinstehen, daß zur Instanzierungszeit das-und-das-und-das passieren soll oder muß, damit am Ende der Tab-Bar ein neues Tab hinzugefügt wird, was man anklicken kann und wenn man das tut, daß dann das zugehörige Dialogfeld angezeigt wird.

Eine Klasse ist also an 'die Realität' angelehnt und soll die ganze Chose vereinfachen. Man muß nicht wissen, was passiert (das wird gekapselt); es reicht, wenn man sagt
 myDialogFeld d = new myDialogfeld('Eigenschaften'); 
d.Show();
und diese zwei Zeilen kümmern sich um alles Notwendige.

Darauf folgen dann Ableitungen. Die spezialisieren das Ganze. Statt also X viele Parameter für eine allgemeinere Klasse übergeben zu müssen, stampft man das eine Etage höher.

Beispiel: es gibt eine Klasse INPUT wie zB bei HTML, was Text, Paßwort, Radio/Checkbox usw sein kann. Davon leitet man dann eine Klasse RadioBox ab, welche wie der Name andeutet Radioboxen anlegt. Das ist dann auch ein INPUT-Objekt (kann ebenso wie dieses in ein Formular) aber es reicht zu sagen
RadioBox r = new RadioBox(array(1=>'Y',2=>'N')
um einen zweiteiligen Radiobutton zu kriegen mit den Optionen Y und N und den zugeordneten Werten 1 und 2. Mit dem generischen Input hätte man das auch hingekriegt, aber sehr viel umständlicher.
In Anlehnung daran gibt's außerdem abstrakte / virtuelle Klassen. Das sind die, die man nicht instantiieren kann, weil sie - eben abstrakt sind. Um beim Beispiel zu bleiben: INPUT wäre eine solche abstrakte Klasse. Es ist klar, was damit gemeint ist; aber es gibt keine darstellbare Form eines INPUT-Objekts, wenn man nicht dazusagt, was es für eins IST (Bild, Submit, Text, whatever). Oder "Auto": man kann noch sagen, ein Auto hat üblicherweise vier Räder... aber das können auch drei oder acht gewesen sein, zwei Achsen ja, aber vielleicht auch drei oder vier, und ob es ein PKW ist oder ein LKW wissen wir nicht, und selbst wenn wir das wüßten haben wir immer noch keine Ahnung re: Marke oder Hersteller oder Farbe. Kurz, es ist möglich und notwendig, "echte" Klassen draus abzuleiten, aber abgesehen von grundlegender, abstrakter Beschreibung eines Objektes kann man sonst nichts machen. Insbesondere: Object o = new AbstractObject() schlägt mit Hinweis auf Nicht-Erstellbarkeit fehl.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild

#177029 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 19. Juni 2017 - 21:57

Ich suche ja immer noch wie verrückt nach einem Beispiel im Netz. Irgend etwas ganz simples, wo man das Schema erkennt. Ich habe jetzt »das Hier« gefunden. Also den Rechner zusammenzubasteln, dass der funktioniert ist ja nun kein Problem, aber ein paar Seiten weiter ist dann erklärt, wie man den Code aufteilt, indem man Teile in Klassen auslagert. Ganz gut für Anfänger erklärt, aber funktioniert bei mir nicht.

Das Problem ist dass, da nur der halbe Code drinsteht, weil das Fenster wahrscheinlich mit diesem Qt-Designer erstellt wurde als grafisch zusammengeklickt und dann steht da kein Code für die ganze Deklarierung der Variablen drin. Ich tippe aber meinen Code immer selbst und dann funktioniert das am Ende nicht, weil ich am Ende 5 Daten habe und die Variablen nicht deklarieren kann, bzw. nicht weiß in welcher von den vielen Dateien.

Also bei meiner eigenen Version funktioniert das natürlich noch, da weiß ich, was wo hinkommt, aber wenn ich dann Klassen auslagern will, dann krieg ich das Deklarieren nicht mehr hin.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.

#177030 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 19. Juni 2017 - 22:20

Ja, diese Designer weichen den OO-Code auf, sodaß man das irgendwann nicht mehr so nennen kann. Ich hab dann für mich auch irgendwann ein "Template" erstellt, was ich dann bloß noch kopieren muß für eine funktionierende neue Applikation, damit ich da nicht irgendwelchen generierten Code reingedrückt krieg.

Das Schema ist eigentlich ganz einfach: Zusammen kommt, was zusammen gehört.

Gibt es Eigenschaften oder Funktionen, die klassenspezifisch sind? Dann werden die statisch. Ein PKW hat vier Räder, also ist das eine Klasseneigenschaft; aber nicht alle PKWs sind Volkswagen, also ist das keine.

Klassen sind in sich geschlossen. Was in der Klasse gemacht wird, bleibt in der Klasse. Wie in der Schule. :ph34r:

Soll das anders sein, muß man das sagen. Üblicherweise per public-Schlüsselwort vor der Deklaration. Klassenspezifische Eigenschaften und Funktionen sind deshalb normalerweise public static, also zB public static int Räder = 4. Jetzt kann von außen auf die Räder zugegriffen werden.

Als nächstes kommen die Eigenschaften. Für OO sind auch diese abstrahiert. Man "kann" mit zB getProperty() und setProperty() kommen, je nach Programmierumgebung; aber es ist durchaus auch möglich, für eine Objekteigenschaft get und set -Funktionen zu definieren.

Einfaches Beispiel:
public class Test
{
private int varA, varB; // private Integer => Zugriff von außen nicht möglich
public Test // Constructors immer mit dem Zugriffslevel der Klasse selbst, üblicherweise public
 {
  public int TestProperty { get { getProp(); } set { setProp(value); }}
 }

private int getProp() { return varA; }
private void setProp(int param) {varA = param;} 
}



synchronisiert die nach außen verfügbare Eigenschaft TestProperty mit der internen Variable varA. Das muß aber nicht so sein. Richtig leuchten wird so eine Konstruktion erst mit einem Backend, wo getProp() einen Wert aus der Datenbank holt und setProp(param) diesen in die Datenbank schreibt. Der Rest ist dann völlig transparent.

Anwendung ist dann so:
Test t = new Test();
t.TestProperty = 5; // ruft den SETer auf => schreibt zB die 5 in die Datenbank
echo (t.TestProperty); // ruft den GETer auf => holt mit im GETer definierten SQL-Befehl den Wert aus der Datenbank



sodaß ein "t.TestProperty = 10"; nicht dafür sorgt, daß nun Speicher im RAM für die 10 zugeordnet wird und die 10 weg ist bei Programmende, sondern die 10 wird sofort in die Datenbank geschrieben, ohne daß man was zusätzlich machen muß. Außerdem kann man die GET und SET Funktion einfach abändern, wenn sich zB die Schnittstelle ändert oder wenn eine andere DB verwendet werden muß oder oder. Im Code bleibt die eine Codezeile, aus der nicht mehr ersichtlich ist, WAS da überhaupt passiert.


Dasselbe für Methoden. Traditionell haben die keine Rückgabewerte (kann man aber natürlich machen). Note: keine Rückgabewerte heißt nicht, daß nix zurückkommt. Es heißt nur, daß der Rückgabewert nicht Zweck der Methode ist. Object.Add(5) muß zB nicht zugewiesen werden, sondern sorgt dafür, daß 5 dem Objekt draufaddiert wird; wie und wo, muß man selber festlegen. Object.Add kann aber zB false zurückgeben, zB wenn die 5 nicht addiert werden konnte oder wenn zB der Zähler schon bei 9 stand und maximal 11 sein durfte und also die 5 nicht draufaddiert werden konnte (Anwendungsfall: Objekt Glas und Methode Füllen(int wieviel) und überlaufen wollen wir aber nicht.



Deswegen ist es überhaupt kein Problem, alle Klassen isoliert zu betrachten. Nur der Code innerhalb jeder Klasse muß irgendwie stimmig sein und man muß sich überlegen, wie die Klasse (bzw die daraus erstellten Objekte) mit anderen interagieren können müssen.

Dieser Beitrag wurde von RalphS bearbeitet: 19. Juni 2017 - 22:24

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild

Thema verteilen:



6 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 6, unsichtbare Mitglieder: 0