powered by hsp3dish.js / OpenHSP
HSPでポリモーフィズムっぽい何かで他言語におけるポリモーフィズムみたいな書き方ができることを確認したので、例として 15分でわかる かんたんオブジェクト指向の(J)から(N)位までのソースコードを移植・実装してみました(Qiita記事)。
なお、HSP3Dishで関数内にgosub投げると大体壊れるので、対応策としてrefstrで返り値を受け取っています。
#include "hsp3dish.as" screen 0,640,480 redraw 0 color 0,0,0 boxf color 187,187,187 font "monospace",14 pos 10,5 // getFullName以外をPersonに実装 #module Person givenName, familyName, age, getFullNamePtr #modinit str initialGivenName, str initialFamilyName, int initialAge super@Person thismod, initialGivenName, initialFamilyName, initialAge getFullNamePtr = *getFullNameSub return #modfunc local super str initialGivenName, str initialFamilyName, int initialAge givenName = initialGivenName familyName = initialFamilyName age = initialAge return *getFullNameSub return "null" // 無意味な値を返す #modfunc getFullName gosub getFullNamePtr return refstr #modcfunc getGivenName return givenName #modfunc setGivenName str newGivenName givenName = newGivenName return #modcfunc getFamilyName return familyName #modfunc setFamilyName str newFamilyName familyName = newFamilyName return #modcfunc getAge return age #modfunc setAge int newAge age = newAge return #global // Personを継承してWesternPersonを作る // (extendsは継承を表すときに使われることが多いキーワード) #module WesternPerson givenName, familyName, age, getFullNamePtr // WesternPersonのコンストラクタ #modinit str initialGivenName, str initialFamilyName, int initialAge // 継承元のPersonのコンストラクタを呼んで初期化 // (superは継承元のクラスを表すときに使われることが多いキーワード) super@Person thismod, initialGivenName, initialFamilyName, initialAge getFullNamePtr = *getFullNameSub return // PersonではなくここでgetFullNameを実装 *getFullNameSub // return getGivenName(thismod) + " " + getFamilyName(thismod) // 名 姓 return givenName@Person + " " + familyName@Person // 名 姓 #global // Personを継承してEasternPersonを作る #module EasternPerson givenName, familyName, age, getFullNamePtr // EasternPersonのコンストラクタ #modinit str initialGivenName, str initialFamilyName, int initialAge // 継承元のPersonのコンストラクタを呼んで初期化 super@Person thismod, initialGivenName, initialFamilyName, initialAge getFullNamePtr = *getFullNameSub return // PersonではなくここでgetFullNameを実装 *getFullNameSub //return getFamilyName(thismod) + " " + getGivenName(thismod) // 姓 名 return familyName@Person + " " + givenName@Person // 姓 名 #global newmod _westernPerson, WesternPerson, "Albert", "Einstein", 26 newmod _easternPerson, EasternPerson, "信長", "織田", 47 getFullName _westernPerson mes refstr // Albert Einstein getFullName _easternPerson mes refstr // 織田 信長 newmod people, WesternPerson, "Albert", "Einstein", 26 newmod people, EasternPerson, "信長", "織田", 47 newmod people, WesternPerson, "Isaac", "Newton", 43 newmod people, EasternPerson, "秀よし", "豊臣", 61 newmod people, WesternPerson, "Galileo", "Galilei", 46 newmod people, EasternPerson, "家康", "徳川", 73 // peopleの要素を一つずつpersonに代入して実行されるfor-eachループ foreach people getFullName people(cnt) mes refstr loop // Personクラス newmod _person, Person, "Albert", "Einstein", 26 getFullName _person mes refstr // null redraw 1