|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 18.01.2014, 22:28 Titel: [FB] [Übung/Demo] Beispiele mit Polymorphismus |
|
|
Heute wieder einmal etwas mit FreeBasic experimentiert und dabei festgestellt, dass mittlerweilen auch das Konzept der Vererbung und damit Polymorphismus in einer bereits recht bauchbaren Form existiert.
Zuerst ein beliebtes Kursbeispiel: Die Tiere, die Laute von sich geben:
http://beilagen.dreael.ch/QB/VererbungsTest.bas
Man beachte also das Array t() vom Typ Tier, welches ich mit New Katze() und New Hund() füllen kann.
Im Anschluss noch ein erheblich praktischeres Beispiel: Grafikobjektverwaltung, wie sie in ein CAD-Zeichenprogramm hineinpasst:
http://beilagen.dreael.ch/QB/GrafikObjekt.bas
Hier achte man auf das Array figur(), welches ich mit einem beliebigen Gemisch aus Linien, Kreise und Kreisbogen füllen kann. Statt direkte LINE und CIRLCE rufe ich nur noch die von jedem Objekt verstandene Methode Zeichne() auf.
Und richtig elegant wird das Ganze, sobald ich noch drehen und skalieren möchte: Für beides wird eine entsprechende Methode bereitgestellt, so dass sich die Schleife auch wiederum überhaupt nicht kümmern muss, ob es nun eine Linie, Kreis oder Kreisbogen ist.
Nebenbei ist die Farbe noch als Beispiel für ein bei allen Zeichenobjekten gemeinsames Attribut zu verstehen, deswegen braucht es typischerweise keine spezialisierte WechsleFarbe()-Methode für jede Spezialisierung.
Einziger gefundener Bug auf Compilerebene (Programm wird zwar übersetzt, beendet aber mit einem Windows Vista-typischen "Dieses Programm funktioniert eventuell nicht richtig" und will einen Crashreport nach Redmond senden): Beim Bogen drehen und skalieren hat der Aufruf der übergeordneten Methode nicht richtig geklappt, weshalb ich die Operationen (=Parent-Konstruktor ausprogrammieren) auch direkt auf den Mittelpunkt und Radius direkt anwenden musste.
Ausserdem ebenfalls ein "Known issue": Weil sich Base() (übergeordneter Konstruktor aufrufen) sozusagen erst zur Laufzeit aufrufen lässt (nach der Sub-Zeile dürfen noch Dinge stehen), benötigt der Compiler von den Basisklassen zwingend einen Default-Konstuktor auch dort, wo es semantisch eigentlich nicht nötig wäre.
Weitere Einschränkung: FbEdit kennt viele dieser ganz neuen Schlüsselwörter wie "Virtual" und "Abstract" ebenfalls noch nicht und kann daher noch nie so komfortable Code Completion vergleichbar mit einem Eclipse in Java anbieten. Compilerfehlerverarbeitung auf Zeilennummernebene klappt jedoch problemlos. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 20.01.2014, 12:43 Titel: |
|
|
Mit der bug-version
Code: | tpm@kiste12:/media/data20_md0/Projekte/freeBASIC/test/vererben$ fbc vererben.bas -g && valgrind ./vererben
==31248== Memcheck, a memory error detector
==31248== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==31248== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==31248== Command: ./vererben
==31248==
==31248== Stack overflow in thread 1: can't grow stack to 0xfe034ffc
==31248== Can't extend stack to 0xfe034920 during signal delivery for thread 1:
==31248== no stack segment
==31248==
==31248== Process terminating with default action of signal 11 (SIGSEGV)
==31248== Access not within mapped region at address 0xFE034920
==31248== at 0x804BC6A: BOGEN::DREHE(PUNKT&, float) (vererben.bas:167)
==31248== If you believe this happened as a result of a stack
==31248== overflow in your program's main thread (unlikely but
==31248== possible), you can try to increase the size of the
==31248== main thread stack using the --main-stacksize= flag.
==31248== The main thread stack size used in this run was 8388608.
==31248==
==31248== HEAP SUMMARY:
==31248== in use at exit: 485,940 bytes in 1,917 blocks
==31248== total heap usage: 3,041 allocs, 1,124 frees, 625,678 bytes allocated
==31248==
==31248== LEAK SUMMARY:
==31248== definitely lost: 6,944 bytes in 248 blocks
==31248== indirectly lost: 0 bytes in 0 blocks
==31248== possibly lost: 307,516 bytes in 4 blocks
==31248== still reachable: 171,480 bytes in 1,665 blocks
==31248== suppressed: 0 bytes in 0 blocks
==31248== Rerun with --leak-check=full to see details of leaked memory
==31248==
==31248== For counts of detected and suppressed errors, rerun with: -v
==31248== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 39 from 8)
Getötet
|
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
Quisslich
Anmeldungsdatum: 09.09.2012 Beiträge: 38
|
Verfasst am: 20.01.2014, 13:14 Titel: |
|
|
schöne Beispiele. Danke.
Wirklich schade, dass FBEdit scheinbar nicht mehr weiterentwickelt wird. Immerhin kann man neue Schlüsselwörter soweit bekannt machen, dass sie farblich hervorgehoben werden und auch der erste Buchstabe in Gross gewandelt wird.
Dazu die neuen Schlüsselwörter in FBEdit.ini einfügen im Block [Edit]
und in der Datei Api\fbCase.api |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 13.04.2015, 10:23 Titel: Re: [FB] [Übung/Demo] Beispiele mit Polymorphismus |
|
|
dreael hat Folgendes geschrieben: | Ausserdem ebenfalls ein "Known issue": Weil sich Base() (übergeordneter Konstruktor aufrufen) sozusagen erst zur Laufzeit aufrufen lässt (nach der Sub-Zeile dürfen noch Dinge stehen), benötigt der Compiler von den Basisklassen zwingend einen Default-Konstuktor auch dort, wo es semantisch eigentlich nicht nötig wäre. |
Inzwischen dieses Beispiel mit dem neuen FBC 1.02.0 (04-05-2015) frisch getestet; dieses Problem wurde dort nun gefixt, d.h. ich kann nun problemlos die Methode der Basisklasse aufrufen. => Unter
http://beilagen.dreael.ch/QB/GrafikObjekt.bas
entsprechend angepasst. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|