ã¬ã¬ã·ãŒç¬¬8ç« ïŒé¢æ°ãã€ã³ã¿ãšC++ã¡ã³ã颿°ãã€ã³ã¿ã®æª
Cèšèªã¹ã¿ã€ã«ã®void*ã³ãŒã«ããã¯ããåå®å
šãªã¡ã³ã颿°ãã€ã³ã¿ã»å§è²ã»ã€ãã³ããªã¹ããŒèšèšãž
ã²ãŒã éçºã«ãããŠããã¿ã³ãã¯ãªãã¯ãããæãåºãããæµãåãããã¹ã³ã¢ãå ç®ããããã¿ã€ããŒã鳎ã£ããæµãæ¹§ãããããšãã£ãã€ãã³ãéç¥ã¯èšèšã®èŠã§ããCèšèªã§ã¯ `void (*callback)(void* userData)` ã«ããã³ãŒã«ããã¯ãå®çªã§ããããåå®å
šæ§ã®åªå€±ãšãã£ã¹ããã¹ã«ãã峿»ã¯ã©ãã·ã¥ã®æž©åºã§ãããããã«C++ã§ã¯ãã¯ã©ã¹ã®ã¡ã³ã颿°ã¯éåžžã®é¢æ°ãã€ã³ã¿ãšã¯å
šãç°ãªããå€éç¶æ¿ãä»®æ³é¢æ°ã«å¯Ÿå¿ããããã®è€éãªå
éšæ§é ïŒæå€§16ã24ãã€ãïŒããæã£ãŠããŸããæ¬ç« ã§ã¯ãã¡ã³ã颿°ãã€ã³ã¿ã®ç©çã¡ã¢ãªæ§é ãè§£æããã¢ãã³C++ïŒC++11ã®ã©ã ããstd::functionïŒãç»å Žãã以åã«çŸå Žã®ãšã³ãžãã¢ãè¡ãšæ±ã§ç¯ãäžãããåå®å
šãªå§è²ïŒDelegateïŒèšèšãããã¹ã¿ãŒããŸãã
L8.1 Cèšèªæµ void* ã³ãŒã«ããã¯ã®æ å
ãšéç
ã€ãã³ãé§åã®åç¹ã颿°ãã€ã³ã¿ãšãŠãŒã¶ãŒããŒã¿ãã€ã³ã¿ãããªã void* ã¯æªéã®å¥çŽãšåŒã°ããã®ãïŒåæ¶æ»
ã«ããã¡ã¢ãªç Žå£ã®ææãåŠã³ãŸãã
ð§ ãã³ã®ã³å
茩
ãã³å
çâŠâŠïŒUIãã¿ã³ã®ã¯ãªãã¯åŠçãCèšèªã®æç§æžéãã« `typedef void (*ClickCallback)(void* userData);` ã§å®è£
ãããã§ãããã¿ã³ãæŒãããèªæ©ã®ãã ãçºåãããããšãããã§ãããã²ãŒã ãè¬ã®å³æ»ã¯ã©ãã·ã¥ãèµ·ãããŸããâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
ã¬ããïŒã©ãã©ããã³ãŒããèŠããŠã¿ãâŠâŠã»ãããã¿ã³çææã«æž¡ãã `userData` 㯠`SoundManager*` ãªã®ã«ãã³ãŒã«ããã¯é¢æ°ã®äžã§ `(Player*)userData` ã«ãã£ã¹ãã㊠`player->fireBomb()` ãåŒãã§ãããïŒ
ð§ ãã³ã®ã³å
茩
ãããããïŒæž¡ãããã€ã³ã¿ãšåãåã£ããã€ã³ã¿ã®åãå
šç¶éã£ããã§ããïŒïŒã§ããã³ã³ãã€ã©ã¯äžåèŠåãåºããŠãããŸããã§ããâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
ããããã `void*`ïŒåãªããã€ã³ã¿ïŒã®åªãããïŒCèšèªã§ã¯é¢æ°ã®åŒæ°ãå
±éåããããã« `void*` ã§äœã§ãåãæž¡ãèšèšãæµè¡ã£ãããããã¯ãã³ã³ãã€ã©ã®åãã§ãã¯ãšããæå€§ã®å®å
šç¶²ãèªãããã«æšãŠãæªéã®å¥çŽããªããããïŒ
ð LegacyCallback.h
#pragma once
#include <iostream>
// â Cèšèªæµã³ãŒã«ããã¯: åæ
å ±ãå®å
šã«æ¶ãå»ã
typedef void (*RawButtonCallback)(int buttonId, void* userData);
class LegacyButton {
private:
int buttonId_;
RawButtonCallback callback_;
void* userData_;
public:
LegacyButton(int id)
: buttonId_(id), callback_(nullptr), userData_(nullptr) {}
void setCallback(RawButtonCallback cb, void* data) {
callback_ = cb;
userData_ = data; // åãã§ãã¯ãªãã§äœã§ã代å
¥ã§ããŠããŸã
}
void press() {
std::cout << "[LegacyButton " << buttonId_ << "] ã¯ãªãã¯ãããŸãã\n";
if (callback_) {
callback_(buttonId_, userData_);
}
}
};
ð TypeSafeListener.h
#pragma once
#include <iostream>
// â
C++æµã€ã³ã¿ãŒãã§ãŒã¹: ã³ã³ãã€ã©ãåã100%ä¿èšŒãã
class IButtonListener {
public:
virtual ~IButtonListener() = default;
virtual void onButtonPressed(int buttonId) = 0;
};
class SafeButton {
private:
int buttonId_;
IButtonListener* listener_;
public:
SafeButton(int id) : buttonId_(id), listener_(nullptr) {}
// IButtonListener ãå®è£
ããã¯ã©ã¹ã®ãã€ã³ã¿ããåãä»ããªã
void setListener(IButtonListener* listener) {
listener_ = listener;
}
void press() {
std::cout << "[SafeButton " << buttonId_ << "] ã¯ãªãã¯ãããŸãã\n";
if (listener_) {
listener_->onButtonPressed(buttonId_);
}
}
};
L8.2 C++ã¡ã³ã颿°ãã€ã³ã¿ã®æªå¥ãªæ£äœãšã¡ã¢ãªæ§é
`void (*f)()` ã«ã¡ã³ã颿°ã代å
¥ãããšã³ã³ãã€ã«ãšã©ãŒïŒã¡ã³ã颿°ãã€ã³ã¿ã®ãµã€ãºã8ãã€ãã§ã¯ãªã16ã24ãã€ãã«ãªãç©çççç±ãè§£æããŸãã
ð§ ãã³ã®ã³å
茩
ãã³å
çãã€ã³ã¿ãŒãã§ãŒã¹ãäœãã®ãããã§ãããããããåºåºã¯ã©ã¹ãç¶æ¿ããã«ãPlayerã¯ã©ã¹ã® `fireBomb` ã¡ã³ã颿°ããçŽæ¥é¢æ°ãã€ã³ã¿ã«ä»£å
¥ã§ããªããã§ããïŒ `void (*fp)() = &Player::fireBomb;` ãšæžãããã³ã³ãã€ã©ã«æé³ŽãããŸããâŠâŠã
ð»ââïž ã·ãã¯ãå
ç
ãã©ããã©ããã©ïŒãããC++åå¿è
ã2çªç®ã«ã¶ã€ãã巚岩ãã¡ã³ã颿°ãã€ã³ã¿ã®æªãããïŒã¡ã³ã颿°ã¯æ®éã®é¢æ°ãšã¯å
šãå¥ç©ãªããããïŒ
ð§ ãã³ã®ã³å
茩
ãã£ïŒïŒã¯ã©ã¹ã®äžã«æžããŠããã ãã§ãçµå±ã¯ã¡ã¢ãªäžã®æ©æ¢°èªã³ãŒãã§ãããïŒãªãã§æ®éã®é¢æ°ãã€ã³ã¿ã«ä»£å
¥ã§ããªããã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
ã¡ã³ã颿°ãåŒã¶ã«ã¯ãå¿
ãæé»ã®ç¬¬1åŒæ°ãšããŠãã©ã®ã€ã³ã¹ã¿ã³ã¹ãã瀺ã `this` ãã€ã³ã¿ããCPUã¬ãžã¹ã¿ïŒECXãRDIïŒã«ã»ããããã°ãªããïŒããã«å€éç¶æ¿ãä»®æ³é¢æ°ãããå Žåã`this` ãã€ã³ã¿ãäœãã€ãããããïŒãªãã»ããïŒãã`vtable` ã®äœçªç®ããšããæ
å ±ãå¿
èŠã«ãªãããã®ããã¡ã³ã颿°ãã€ã³ã¿ã®ãµã€ãºã¯8ãã€ãã§ã¯ãªãã16ãã€ãã24ãã€ããã«ãèšãäžãããããïŒ
ð MemberPointerDemo.cpp
#include <iostream>
class Spaceship {
private:
int shield_ = 100;
public:
void repairShield(int amount) {
shield_ += amount;
std::cout << "ã·ãŒã«ã修埩: +" << amount << " (çŸåšå€: " << shield_ << ")\n";
}
void emergencyBoost(int amount) {
shield_ -= amount;
std::cout << "ç·æ¥å éïŒã·ãŒã«ãæ¶è²»: -" << amount << " (çŸåšå€: " << shield_ << ")\n";
}
};
int main() {
Spaceship ship;
// ã¡ã³ã颿°ãã€ã³ã¿ã®å®£èš
void (Spaceship::*action)(int) = nullptr;
// ç¶æ³ã«å¿ããŠåŒã³åºãã¡ã³ã颿°ãåãæ¿ã
action = &Spaceship::repairShield;
(ship.*action)(20); // ã·ãŒã«ã修埩ãåŒã°ãã
action = &Spaceship::emergencyBoost;
(ship.*action)(15); // ç·æ¥å éãåŒã°ãã
// ã¡ã³ã颿°ãã€ã³ã¿ã®ãµã€ãºã衚瀺
std::cout << "éåžžãã€ã³ã¿ã®ãµã€ãº: " << sizeof(void*) << " ãã€ã\n";
std::cout << "ã¡ã³ã颿°ãã€ã³ã¿ã®ãµã€ãº: " << sizeof(action) << " ãã€ã\n";
// å€ãã®ã³ã³ãã€ã©ïŒMSVCãGCCïŒã§ 16ãã€ã ãšè¡šç€ºãããïŒ
return 0;
}
L8.3 ã¬ã¬ã·ãŒC++ã«ãããå®å
šãªå§è²ïŒDelegateïŒèšèšã®å®è·µ
ã¢ãã³C++ã®ã©ã ãåŒããªãæä»£ãçŸå Žã¯ã©ãæŠã£ããïŒã€ã³ã¹ã¿ã³ã¹ãšã¡ã³ã颿°ãã€ã³ã¿ãäžäœåãããDelegateïŒå§è²ïŒããã¿ãŒã³ã®å®å
šå®è£
ã
ð§ ãã³ã®ã³å
茩
ãªãã»ã©ïŒã¡ã³ã颿°ãã€ã³ã¿ã«ã¯ãã€ã³ã¹ã¿ã³ã¹ããå¿
èŠãªãã§ããããšããããšã¯ããã€ã³ã¹ã¿ã³ã¹ã®ãã€ã³ã¿ããšãã¡ã³ã颿°ãã€ã³ã¿ãã1ã€ã®ã¯ã©ã¹ã«ãŸãšããŠä¿æããã°ãCèšèªã®é¢æ°ãã€ã³ã¿ã¿ããã«æè»œã«æ±ããããããªãã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
ãèŠäºïŒãŸãã«ããããããC#ã® `delegate` ãã¢ãã³C++ã® `std::function` ã®ååãšãªã£ããDelegateïŒå§è²ïŒãã¿ãŒã³ãããïŒã²ãŒã éçºã®æŽå²ã«ãããŠãUIã·ã¹ãã ãã€ãã³ããã£ã¹ãããã£ãæã£ãäŒèª¬ã®ææ³ãããªïŒ
ð§ ãã³ã®ã³å
茩
ããïŒUIãã¿ã³ã«DelegateãæãããŠãèªæ©ïŒPlayerïŒã®å埩ããã ããµãŠã³ãïŒSoundManagerïŒã®BGMåçãççµåã«åŒã³åºããããã«ããŠã¿ãŸãïŒ
ð Delegate.h
#pragma once
#include <iostream>
// 1. æœè±¡å§è²åºåºã¯ã©ã¹
class IActionDelegate {
public:
virtual ~IActionDelegate() = default;
virtual void execute(int value) = 0;
};
// 2. ä»»æã®ã¯ã©ã¹ã®ã¡ã³ã颿°ãå®å
šã«ãã€ã³ããããã³ãã¬ãŒã
template <typename T>
class MemberDelegate : public IActionDelegate {
private:
T* targetInstance_;
void (T::*targetFunc_)(int);
public:
MemberDelegate(T* inst, void (T::*func)(int))
: targetInstance_(inst), targetFunc_(func) {}
void execute(int value) override {
if (targetInstance_ && targetFunc_) {
(targetInstance_->*targetFunc_)(value);
}
}
};
// 3. åæšè«ãå¹ãããŠç°¡æœã«çæãããã«ããŒé¢æ°
template <typename T>
IActionDelegate* createDelegate(T* inst, void (T::*func)(int)) {
return new MemberDelegate<T>(inst, func);
}
ð GameEventSystem.cpp
#include "Delegate.h"
#include <vector>
#include <string>
// ã²ãŒã å
ã®ãã¿ã³UI
class GameUIButton {
private:
std::string label_;
int eventValue_;
IActionDelegate* actionDelegate_ = nullptr;
public:
GameUIButton(const std::string& label, int value)
: label_(label), eventValue_(value) {}
~GameUIButton() {
delete actionDelegate_; // ç»é²ãããããªã²ãŒããè§£æŸ
}
void setOnClick(IActionDelegate* del) {
delete actionDelegate_;
actionDelegate_ = del;
}
void simulateClick() {
std::cout << "\n[UI] ãã¿ã³ã" << label_ << "ããæŒãããŸããïŒ\n";
if (actionDelegate_) {
actionDelegate_->execute(eventValue_);
}
}
};
// ãã¬ã€ã€ãŒ
class PlayerCharacter {
public:
void triggerBomb(int blastPower) {
std::cout << "ð£ [Player] ã¡ã¬ãã çžè£ïŒ åšå: " << blastPower
<< " ç»é¢å
ã®å
šæµã«å€§ãã¡ãŒãžïŒ\n";
}
void heal(int hpAmount) {
std::cout << "ð [Player] ãããªãã¢èµ·åïŒ HPã " << hpAmount << " å埩ïŒ\n";
}
};
// ãµãŠã³ããããŒãžã£ãŒ
class AudioSystem {
public:
void playBgmTrack(int trackId) {
std::cout << "ðµ [Audio] BGMãã©ã㯠#" << trackId << " ãåçéå§\n";
}
};
int main() {
PlayerCharacter player;
AudioSystem audio;
// ãã¿ã³ã®äœæ
GameUIButton bombButton("ãã çºå", 999);
GameUIButton healButton("ç·æ¥å埩", 50);
GameUIButton musicButton("BGM倿Ž", 3);
// â
åå®å
šã«ç°ãªãã¯ã©ã¹ã®ã¡ã³ã颿°ãç»é²ïŒ
// çžæã Player ã§ã AudioSystem ã§ããåããã¿ã³ã¯ã©ã¹ã§ééçã«æ±ããïŒ
bombButton.setOnClick(createDelegate(&player, &PlayerCharacter::triggerBomb));
healButton.setOnClick(createDelegate(&player, &PlayerCharacter::heal));
musicButton.setOnClick(createDelegate(&audio, &AudioSystem::playBgmTrack));
// ãã¿ã³ã®ã¯ãªãã¯ãã·ãã¥ã¬ãŒã
bombButton.simulateClick();
healButton.simulateClick();
musicButton.simulateClick();
return 0;
}
ð ç解床ãã§ãã¯ã¯ã€ãº
Q1. Cèšèªã¹ã¿ã€ã«ã® `void (*callback)(void* userData)` ã³ãŒã«ããã¯ããå€§èŠæš¡ãªã²ãŒã éçºã§æ·±å»ãªãã°ã®æž©åºãšãªãæå€§ã®èšèšççç±ã¯ã©ãã§ããããïŒ
- 1. 颿°ãã€ã³ã¿ã®åŒã³åºããªãŒããŒããããéåžžã«å€§ãããFPSãèããäœäžãããã
- 2. void* ã«ãã£ã¹ãããæç¹ã§ã³ã³ãã€ã©ã®åãã§ãã¯ãå®å
šã«å€±ãããæž¡ãåããã£ã¹ãå
ãééããŠãã³ã³ãã€ã«ãéã£ãŠå®è¡æã«å³æ»ãããã
- 3. Cèšèªã®é¢æ°ãã€ã³ã¿ã¯1ã€ã®ããã°ã©ã ã®äžã§æå€§10åãŸã§ãã宣èšã§ããªã仿§ã ãã
- 4. void* ã䜿ããšOSã®ã¡ã¢ãªç®¡çæ©èœã忢ããPCãå¿
ãããªãŒãºãããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒvoid* ã«ãã£ã¹ãããæç¹ã§ã³ã³ãã€ã©ã®åãã§ãã¯ãå®å
šã«å€±ãããæž¡ãåããã£ã¹ãå
ãééããŠãã³ã³ãã€ã«ãéã£ãŠå®è¡æã«å³æ»ãããã
æ£è§£ã¯ãvoid* ã«ãã£ã¹ãããæç¹ã§ã³ã³ãã€ã©ã®åãã§ãã¯ãå®å
šã«å€±ãããæž¡ãåããã£ã¹ãå
ãééããŠãã³ã³ãã€ã«ãéã£ãŠå®è¡æã«å³æ»ãããããã§ããvoid* ã¯åæ
å ±ãæããªããããäŸãã° Player* ãæž¡ãã¹ãå Žæã«èª€ã£ãŠ SoundManager* ãæž¡ããŠãã³ã³ãã€ã©ã¯äžåæ€ç¥ã§ãããå®è¡æã«äžæ£ãªã¡ã¢ãªã¢ãã¬ã¹ãèªã¿æžãããŠã¯ã©ãã·ã¥ãåŒãèµ·ãããŸãã
Q2. C++ã«ãããŠãéåžžã®é¢æ°ãã€ã³ã¿å `void (*fp)(int)` ã«ãã¯ã©ã¹ã®éstaticã¡ã³ã颿° `void Player::takeDamage(int)` ãçŽæ¥ä»£å
¥ã§ããªãæ¬è³ªçãªçç±ã¯äœã§ããããïŒ
- 1. ã¡ã³ã颿°ã¯ã³ã³ãã€ã«åŸã«åé€ããããããã¡ã¢ãªäžã«æ©æ¢°èªãååšããªããã
- 2. ã¡ã³ã颿°ãæ£ããå®è¡ããã«ã¯ã察象ã®ã€ã³ã¹ã¿ã³ã¹ãæãæé»ã®ç¬¬1åŒæ°ãthis ãã€ã³ã¿ããæž¡ãå¿
èŠããããã
- 3. C++ã§ã¯ãã¹ãŠã®é¢æ°ãã€ã³ã¿ã®å©çšãèšèªèŠæ Œã§çŠæ¢ãããŠãããã
- 4. ã¡ã³ã颿°ã¯åŒæ°ãæå€§ã§1ã€ããåãããšãã§ããªãå¶éããããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒã¡ã³ã颿°ãæ£ããå®è¡ããã«ã¯ã察象ã®ã€ã³ã¹ã¿ã³ã¹ãæãæé»ã®ç¬¬1åŒæ°ãthis ãã€ã³ã¿ããæž¡ãå¿
èŠããããã
æ£è§£ã¯ãã¡ã³ã颿°ãæ£ããå®è¡ããã«ã¯ã察象ã®ã€ã³ã¹ã¿ã³ã¹ãæãæé»ã®ç¬¬1åŒæ°ãthis ãã€ã³ã¿ããæž¡ãå¿
èŠããããããã§ããéstaticã¡ã³ã颿°ã¯ãã©ã®ã€ã³ã¹ã¿ã³ã¹ã®ã¡ã³ã倿°ãæäœããã®ãããç¹å®ããããã«å¿
ã this ãã€ã³ã¿ãå¿
èŠãšããŸããéåžžã®é¢æ°ãã€ã³ã¿ã«ã¯ this ãæž¡ãä»çµã¿ããªããããåã¬ãã«ã§å³å¯ã«åºå¥ãããŠããŸãã
Q3. å€éç¶æ¿ãä»®æ³é¢æ°ãæã€ã¯ã©ã¹ã®ã¡ã³ã颿°ãã€ã³ã¿ã® sizeof ããéåžžã®ãã€ã³ã¿ïŒ64bitç°å¢ã§8ãã€ãïŒããã倧ããïŒ16ãã€ãã24ãã€ãçã«ïŒãªãçç±ãšããŠæ£ãããã®ã¯ã©ãã§ããããïŒ
- 1. 颿°ã®ååïŒæååïŒããã®ãŸãŸãã€ã³ã¿ã®äžã«åã蟌ãŸããŠãããã
- 2. åŒã³åºãæã«å¯Ÿè±¡ã®åºåºã¯ã©ã¹ãž this ãã€ã³ã¿ã®ã¢ãã¬ã¹ãè£æ£ããããã®ãthis ãªãã»ãã調æŽå€ããªã©ãå
éšã«å«ãŸããŠãããã
- 3. ã³ã³ãã€ã©ããã°ãèµ·ãããŠäžèŠãªãŽãããŒã¿ãè©°ã蟌ãã§ããã ãã§ãã
- 4. C++ã®ã¯ã©ã¹ã¯ãã¹ãŠ16ãã€ãåäœã§ã¡ã¢ãªãã¢ã©ã€ã¡ã³ãããªããã°ãªããªããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒåŒã³åºãæã«å¯Ÿè±¡ã®åºåºã¯ã©ã¹ãž this ãã€ã³ã¿ã®ã¢ãã¬ã¹ãè£æ£ããããã®ãthis ãªãã»ãã調æŽå€ããªã©ãå
éšã«å«ãŸããŠãããã
æ£è§£ã¯ãåŒã³åºãæã«å¯Ÿè±¡ã®åºåºã¯ã©ã¹ãž this ãã€ã³ã¿ã®ã¢ãã¬ã¹ãè£æ£ããããã®ãthis ãªãã»ãã調æŽå€ããªã©ãå
éšã«å«ãŸããŠãããããã§ããå€éç¶æ¿ã§ã¯ãã€ã³ã¹ã¿ã³ã¹ã®å
é ã¢ãã¬ã¹ãšååºåºã¯ã©ã¹ã®ã¢ãã¬ã¹ãäžèŽããŸããããã®ããã¡ã³ã颿°ãã€ã³ã¿ã¯ã颿°ã³ãŒãã®ã¢ãã¬ã¹ã ãã§ãªããåŒã³åºãæã« this ãäœãã€ããããã°ãããããšãããªãã»ããæ
å ±ãå
éšã«ä¿æããŠããŸãã
Q4. ã¢ãã³C++ïŒC++11以éã®ã©ã ãåŒã std::functionïŒãååšããªãã£ãC++03æä»£ãçŸå Žã§ç°ãªãã¯ã©ã¹ã®ã¡ã³ã颿°ãåå®å
šã«ã€ãã³ãç»é²ããããã«çšããããèšèšææ³ãšããŠãæãé©åãªãã®ã¯ã©ãã§ããããïŒ
- 1. ãã¹ãŠã®ã¯ã©ã¹ãåäžã®ç¥ã¯ã©ã¹ïŒGod ObjectïŒã«çµ±åããŠã¡ã³ã颿°ãç¡ãã
- 2. ã€ã³ã¹ã¿ã³ã¹ãã€ã³ã¿ãšã¡ã³ã颿°ãã€ã³ã¿ãã¯ã©ã¹ãã³ãã¬ãŒãã§ãã¢ãšããŠä¿æããå
±éã®æœè±¡åºåºïŒIActionDelegateïŒãä»ããŠåŒã³åºãå§è²ïŒDelegateïŒãã¿ãŒã³
- 3. ãã¯ããçšããŠãã¹ãŠã®é¢æ°ãã€ã³ã©ã€ã³å±éããå®è¡æã®é¢æ°åŒã³åºããè¡ããªãããã«ãã
- 4. ã¢ã»ã³ãã©ã§CPUã¬ãžã¹ã¿ãçŽæ¥æžãæããã€ã³ã©ã€ã³ã¢ã»ã³ããªãå
šãã¡ã€ã«ã«èšè¿°ãã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒã€ã³ã¹ã¿ã³ã¹ãã€ã³ã¿ãšã¡ã³ã颿°ãã€ã³ã¿ãã¯ã©ã¹ãã³ãã¬ãŒãã§ãã¢ãšããŠä¿æããå
±éã®æœè±¡åºåºïŒIActionDelegateïŒãä»ããŠåŒã³åºãå§è²ïŒDelegateïŒãã¿ãŒã³
æ£è§£ã¯ãã€ã³ã¹ã¿ã³ã¹ãã€ã³ã¿ãšã¡ã³ã颿°ãã€ã³ã¿ãã¯ã©ã¹ãã³ãã¬ãŒãã§ãã¢ãšããŠä¿æããå
±éã®æœè±¡åºåºïŒIActionDelegateïŒãä»ããŠåŒã³åºãå§è²ïŒDelegateïŒãã¿ãŒã³ãã§ããæ¬ç« ã§å®è£
ãã MemberDelegate<T> ã®ããã«ãã€ã³ã¹ã¿ã³ã¹ãšã¡ã³ã颿°ãã€ã³ã¿ãã«ãã»ã«åããŠåæ¶æ»
ïŒType ErasureïŒãè¡ãããšã§ãvoid* ã1è¡ã䜿ããã«å®å
šãªåå®å
šæ§ãšççµåæ§ãäž¡ç«ãããŠããŸããã
ð»ââïž ã·ãã¯ãC++ã©ã ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ã·ã¹ãã
ãã©ãŠã¶ã§JavaScriptãæå¹ã«ãããšããã©ãŠã¶å
ã€ã³ããŒããŒã²ãŒã ãšãã¥ã¬ãŒã¿ãã¡ã¢ãªãããå¯èŠåãUMLã¯ã©ã¹å³ã察話å解説ãç解床ã¯ã€ãºãèµ·åããŸãã
ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ãéå§ãã â