Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

[FB] [Übung/Demo] Beispiele mit Polymorphismus

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 18.01.2014, 22:28    Titel: [FB] [Übung/Demo] Beispiele mit Polymorphismus Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 20.01.2014, 12:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Quisslich



Anmeldungsdatum: 09.09.2012
Beiträge: 38

BeitragVerfasst am: 20.01.2014, 13:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 13.04.2015, 10:23    Titel: Re: [FB] [Übung/Demo] Beispiele mit Polymorphismus Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz