エラーが発生しています。

HSPでモジュールの継承・ポリモーフィズム(多態性)っぽいもの

by YOS G-spec, at 2018年2月16日 21:49:49

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

作成者
icon

YOS G-spec

ここはユーザの紹介文

詳しく...


関連プログラム