メッセージ転送

メッセージ転送(メッセージてんそう、英語: message forwarding)とは、オブジェクト指向言語において、オブジェクトに対して送られたメッセージを送信対象となっていないオブジェクトやメソッドに転送できる機能のことである。オブジェクト指向言語の中ではSmalltalkにおいて初めて導入された。

概要

純粋な(メッセージ指向の)オブジェクト指向言語において、メッセージ送信は比喩ではなく実在する機構である。メッセージは、セレクターと引数をオブジェクト等でひとまとまりにした値の塊であり、メッセージを受信したオブジェクトはメッセージを解析してメソッドの選択や起動を行う。ここで通常であれば、オブジェクトはメッセージに含まれるセレクターを元に自らが保有するメソッドを調べ、セレクターに一致するメソッドを起動する。しかし、セレクターに該当するメソッドが存在しなかった場合は、メッセージ処理用のメソッドにメッセージを転送し、プログラマによるメソッドの処理を試みるのである。

ここでは、Smalltalkによるメッセージ転送の記述例を示す。Smalltalkではメッセージを受け取ったオブジェクトがセレクターに該当するメソッドを保持していない場合、受け取ったメッセージを「doesNotUnderstand:」メソッドに転送する。次に「doesNotUnderstand:」メソッドのみ登録した「Example」クラスを使用して具体例を示す。

クラス定義:

"ExampleクラスをSmalltalk環境に登録する"
Object
        subclass:               #Example        "ExampleはObjectクラスから派生させる"
        instanceVariableNames:  ''              "オブジェクトに所属する変数は定義しない"
        classVariableNames:     ''              "クラスオブジェクトと共有する変数は定義しない"
        poolDictionaries:       ''              "クラスに所属する変数は定義しない"
        category:               'UserObjects'.  "クラスの分類はUserObjectsとする(今回の名前に意味はない)"

"Exampleに登録するdoesNotUnderstand:メソッドの登録"
Example methodsFor: 'message forwarding'
!
doesNotUnderstand: aMessage 
	"メッセージのセレクターがhelloであるか判定する"
	( aMessage sends: #hello )
		ifTrue:
		[
			"セレクターがhelloであれば次の文字列を返す。"
			^'Selector is hello'.
		]
		ifFalse:
		[
			"セレクターがhello以外なら次の文字列を返す。"
			^'Selector is not hello'
		]
!!

メッセージ送信:

| example |
example := Example new.
example hello.            "'Selector is hello'が返される"
example goodbye.          "'Selector is not hello'が返される"

上記の例は、「hello」とそれ以外のメッセージをExampleが生成したオブジェクトが受け取り、オブジェクトがメッセージ中のセレクターを基準に処理を切り替えている例である。このようにSmalltalkではメッセージ送信が比喩ではなく具体的な機構である事を利用し、オブジェクト宛に送信されたメッセージを自在に制御することができる。

なお、今回メッセージ中のセレクター情報( hello )しか使用していないが、メッセージからは引数情報も参照できる。また、「aMessage sendTo: 送信先のオブジェクト」と記述することでメッセージを別のオブジェクトに送りつけることもできる。

用途

  • (1)全てのメッセージを無視するNullオブジェクトを作る
  • (2)上記を拡張し、必要なメッセージだけを処理するイベントハンドラーを作る
  • (3)受け取ったメッセージをフィールドに委譲し一種の多重継承を実現する
  • (4)フィールドへの委譲を利用し、動的な継承を実現する
  • (5)全てのオブジェクトに対し使用可能なProxyオブジェクトを作る
  • (6)メッセージを遅延送信できる

(4)(5)(6)について補足する。

(4)は、スーパークラスにあたるオブジェクトを実行時に交換できるという事である。古いインタフェース互換性維持などに使用できる。例えばlineToなど単純なPath命令しか備えていないPathクラスと、Pathクラスを使用するVectorImageクラスが存在したとする。ある改修に伴いVectorImageがPathクラスは、drawEllipseを要求するようになった。この時、互換性の面からPathクラスのコードは変更できず、PathクラスにdrawEllipseを追加できないとする。

この様な場合、Pathクラスを継承しdrawEllipseを登録したPathExtendを作成するか、Pathクラスへのメッセージを全て委譲し、更にdrawEllipseを登録したPathExtenderを作成する手がある。継承を使用した前者の場合、Pathクラスと同じInterfaceを持ったクラスの整合性を保つため大量のXxxExtendクラスを作成する事になってしまう。委譲を使用する後者の場合、委譲すべきメッセージが50あるなら50個のメソッドを登録するはめになる。

メッセージ転送が可能な場合では、後者の委譲の方法を採用しつつも、 委譲処理をメッセージ機構に任せる事で、PathExtenderにはdrawEllipseとdoesNotUnderstand:メソッドを登録するだけで済ませることができる。

(5)は、クラスのインタフェース毎にスタブコードを書かずとも遠隔手続き呼出し (RPC) などが可能という事である。C++系統の言語であればRPCの際、一つの関数により一つのオブジェクトに対する全てのメンバー関数呼び出しの内容を横取りできる機能がないため、インタフェース毎にスタブコードを作成しなければならない。 メッセージ転送が可能な場合においては、1つのオブジェクトに対する全てのメッセージを横取りできるため、スタブとなるプロキシクラスを通信方法に合わせ1種類用意しておけば良い。

また、通信方法もメッセージオブジェクトを直列化して送信先に送り、送信先でメッセージオブジェクトに復元して送信先のオブジェクトに送りつければよいので単純になる。

(6)は、メッセージを記録してUndoやRedo、スレッド間通信などに使えるという事である。Smalltalkでは、メッセージを遅延実行するため、メッセージを保存するためのMessageCatcherクラスが用意されている。

| message |
message := ( MessageCatcher new ) size. "sizeメッセージを保存"
message sendTo: 'ABCDEF'.               "文字列にメッセージを送信し6が返される"

メッセージ転送をサポートする言語とライブラリ

言語

Smalltalk
オブジェクトにセレクターで指定されたメソッドが存在しない場合「doesNotUnderstand:aMessage」が呼び出される。
Common Lisp
オブジェクトにメソッドが適用できない場合「no-applicable-method」が呼び出される。また、オブジェクにスロットが存在しない場合「slot-missing」が呼び出される。
Objective-C
オブジェクトにセレクターで指定されたメソッドが存在しない場合「(void)forwardInvocation:(NSInvocation*)invocation」が呼び出される。
Ruby
オブジェクトにセレクターで指定されたメソッドが存在しない場合「def method_missing( selector, *arguments, &block )」が呼び出される。Smalltalkと異なりセレクターや引数がひと塊のメッセージで受け取れず、それぞれ個別に受け取る。また、ブロックを受け取ることができる。
PHP
オブジェクトにセレクターで指定されたメソッドが存在しない場合「function __call( $selector, $argument )」が呼び出される。blockを受け取らない点を除き、Rubyと同様である。
Python
正式にメッセージ転送専用の機能を備えていない。オブジェクトにセレクターで指定されたメソッドが存在しない場合「def __getattr__( this, selector )」が呼ばれるため、クロージャーと組み合わせることにより模倣することができる。また、「def __getattribute__( this, selector )」を定義していれば、セレクターに指定したメソッドの有無に関わらずメッセージ要素を取得できる。

ライブラリ

COM
「IDispatch」インターフェイスを実装している場合、メソッドの選択を自前で実装する必要があるため必然的にメッセージ転送処理を記述する必要がある。
Windows API
Microsoft Windowsでは、ウィンドウがオブジェクトとして振る舞う。そしてウィンドウのメッセージ処理(ウィンドウプロシージャ[1])において、SendMessage()関数[2]あるいはPostMessage()関数[3]などを用いて他のウィンドウにメッセージを同期/非同期転送することができる。PostThreadMessage()関数[4]を用いて、メッセージループを持つスレッドにメッセージを非同期転送することもできる。

脚注

外部リンク

Read other articles:

This article does not cite any sources. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Twisted Souls – news · newspapers · books · scholar · JSTOR (September 2019) (Learn how and when to remove this template message) For the clothing brand, see Twisted Soul. Twisted Souls AuthorShaun HutsonCountryUnited KingdomLanguageEnglishGenreHorror novelPublisherTime Warner ...

 

Basilika Bunda Kesehatan BaikBasilika Bunda Kesehatan Baik di HariharBasilika Bunda Kesehatan BaikLokasiHariharNegaraIndiaDenominasiGereja Katolik RomaSitus webwww.hariharshrine.orgArsitekturStatusBasilika minorStatus fungsionalAktifAdministrasiKeuskupanKeuskupan ShimogaKlerusUskup AgungYang Mulia Mgr. Peter MachadoUskupYang Mulia Mgr. Francis SerraoRektorRomo Antony peter Basilika Bunda Kesehatan Baik adalah sebuah gereja basilika minor Katolik yang terletak di Harihar, India. Basilika ini m...

 

Peta menunjukan lokasi Tagum City Tagum City adalah munisipalitas yang terletak di provinsi Davao del Norte, Filipina. Pada tahun 2010, munisipalitas ini memiliki populasi sebesar 233.254 jiwa atau 46.651 rumah tangga. Pembagian wilayah Secara administratif Tagum City terbagi menjadi 23 barangay, yaitu: Barangay di wilayah Tagum City Barangay Penduduk(2007) Luas wilayah(Hektar) Apokon 21,856 630 Bincungan 3,672 1,485 Busaon 3,427 1,056 Canocotan 9,665 2,655 Cuambogan 5,314 880 La Filipina 9,7...

Travel guidebook publisher Moon PublicationsParent companyAvalon Travel, a member of the Perseus Books GroupFounded1973Headquarters locationBerkeley, CaliforniaPublication typesBooksNonfiction topicsTravel GuidesOfficial websitewww.moon.com Moon is a travel guidebook publisher founded in 1973 in Chico, California.[1] The company started with travel guides to Asia and later also published guides to the Americas. Bill Dalton was the founder and writer of the regularly updated Indonesian...

 

The present flag of the party The flag adopted in 1931 and used by the Provisional Government of Free India during the Second World War Mahatma Gandhi with Congress activists during the Salt March The Indian National Congress was established when 72 representatives from all over the country met at Bombay in 1885. Prominent delegates included Dadabhai Naoroji, Surendranath Banerjee, Badruddin Tyabji, Pherozeshah Mehta, W. C. Banerjee, S. Ramaswami Mudaliar,[1] S. Subramania Iyer, and ...

 

Questa voce o sezione sull'argomento sparatutto non cita le fonti necessarie o quelle presenti sono insufficienti. Puoi migliorare questa voce aggiungendo citazioni da fonti attendibili secondo le linee guida sull'uso delle fonti. Segui i suggerimenti del progetto di riferimento. SingularityvideogiocoLogo del giocoPiattaformaMicrosoft Windows, Xbox 360, PlayStation 3 Data di pubblicazione 19 gennaio 2010 19 luglio 2010 GenereSparatutto in prima persona TemaFantascienza, guerra f...

Peyton StearnsStearns di AS Terbuka 2018Kebangsaan Amerika SerikatLahir8 Oktober 2001 (umur 22)Cincinnati, OhioTinggi173 cm (5 ft 8 in)Memulai pro2022KampusUniversitas TexasPelatihGabriel TrifuTotal hadiahUS$ 295,173TunggalRekor (M–K)113–66 (63.13%)Gelar5 ITFPeringkat tertinggiNo. 89 (10 April 2023)Peringkat saat iniNo. 89 (10 April 2023)Hasil terbaik di Grand Slam (tunggal)AS Terbuka1R (2022)GandaRekor (M–K)29–26 (52.73%)Gelar2 ITFPeringkat tertinggiNo. 196 (...

 

This biography of a living person needs additional citations for verification. Please help by adding reliable sources. Contentious material about living persons that is unsourced or poorly sourced must be removed immediately from the article and its talk page, especially if potentially libelous.Find sources: Dieter Kosslick – news · newspapers · books · scholar · JSTOR (January 2013) (Learn how and when to remove this message) Dieter KosslickDieter Kos...

 

American actress (born 1996) This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This biography of a living person needs additional citations for verification. Please help by adding reliable sources. Contentious material about living persons that is unsourced or poorly sourced must be removed immediately from the article and its talk page, especially if potentially libelous.Find sources: ...

غرام في الطريق الزراعي غرام في الطريق الزراعي  الصنف رومانسي، كوميدي تاريخ الصدور 23 أغسطس 1971 مدة العرض 82 دقيقة البلد  مصر اللغة الأصلية العربية الطاقم المخرج عبد المنعم شكري الإنتاج أفلام الجزيرة الكاتب يوسف عوف البطولة محمد عوضشويكارخيرية أحمدعادل إمام صناعة سينما...

 

Частина серії проФілософіяLeft to right: Plato, Kant, Nietzsche, Buddha, Confucius, AverroesПлатонКантНіцшеБуддаКонфуційАверроес Філософи Епістемологи Естетики Етики Логіки Метафізики Соціально-політичні філософи Традиції Аналітична Арістотелівська Африканська Близькосхідна іранська Буддій�...

 

Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus. La mise en forme de cet article est à améliorer (mai 2020). La mise en forme du texte ne suit pas les recommandations de Wikipédia : il faut le « wikifier ». Ne doit pas être confondu avec Guerre franco-marocaine (1844). Campagne du Maroc Étapes de la « pacification du Maroc ». Informations générales Date 1907 – 1934 Lieu Maroc Issue Victoire française Changements territoria...

Questa voce sull'argomento chimici britannici è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. J. Mercer John Mercer (Great Harwood, Lancashire, 21 febbraio 1791 – 30 novembre 1866) è stato un chimico e industriale tessile britannico, fu uno studioso delle fibre tessili e delle sostanze coloranti. Viene ricordato soprattutto per la messa a punto nel 1844 del trattamento della cellulosa con soda caustica (detto mercerizzazione) che brevettò nel 1851...

 

  لمعانٍ أخرى، طالع يان تايلور (توضيح). إيان تايلور (بالإنجليزية: Ian Taylor)‏    معلومات شخصية الميلاد 7 فبراير 1956   كرويدون  تاريخ الوفاة 8 يونيو 2020 (64 سنة)   سبب الوفاة ذات الرئة  مواطنة المملكة المتحدة  عدد الأولاد 4   الحياة العملية المدرسة الأم كلية ميرت...

 

Subprefecture and commune in Centre-Val de Loire, FranceMontargisSubprefecture and communeThe Briare Canal in Montargis FlagCoat of armsLocation of Montargis MontargisShow map of FranceMontargisShow map of Centre-Val de LoireCoordinates: 47°59′52″N 2°44′00″E / 47.9978°N 2.7333°E / 47.9978; 2.7333CountryFranceRegionCentre-Val de LoireDepartmentLoiretArrondissementMontargisCantonMontargisIntercommunalityCA Montargoise et Rives du LoingGovernment •...

Toyota Corolla VersoInformasiProdusenToyotaMasa produksi2001–2009Bodi & rangkaKelasMPV kompak 5 pintuMobil terkaitCorollaKronologiPenerusToyota Verso Toyota Corolla Verso adalah MPV kompak 5 pintu yang pertama kali diluncurkan oleh Toyota pada tahun 2001 sampai 2009. Generasi pertama Corolla Verso yang dijual di Eropa adalah Corolla Spacio generasi kedua (E120) yang diubah namanya, yang pertama kali dirilis di Jepang pada Mei 2001. Model generasi kedua menjadi model terpisah pada Maret ...

 

Pour les articles homonymes, voir Chicago (homonymie). Chicago Sceau de Chicago Drapeau de Chicago Panorama de Downtown Chicago, le Chicago Theatre, la jetée Navy, la Willis Tower, le pavillon Jay Pritzker, une rame du métro de Chicago et le musée Field. Administration Pays États-Unis État Illinois Comtés Cook et DuPage Type de localité City Maire Mandat Brandon Johnson (D) depuis 2023 Code FIPS 17-14000 GNIS 0428803 Indicatif(s) téléphonique(s) local (locaux) 312/773 Démographie G...

 

Historical region in eastern-central Europe For other uses, see Banat (disambiguation), Banate (disambiguation), and Ban (title). Historical regionBanat Banat (Romanian)Банат / Banat (Serbian)Bánság (Hungarian)Historical regionMap of the region of BanatCoordinates: 45°42′00″N 20°54′00″E / 45.7000°N 20.9000°E / 45.7000; 20.9000Country  Romania  Serbia  Hungary Largest cityTimișoaraArea • Total28,526 km2 ...

Nicolas TétraultMontreal City CouncillorPlateau-Mont-RoyalIn office2001–2005Preceded byAndré CardinalSucceeded by[district abolished] Personal detailsPolitical partyVision Montréal, MICUResidence(s)Montreal, Quebec, Canada Nicolas Tétrault is a politician and entrepreneur in Montreal, Quebec, Canada. He served on the Montreal City Council from 2001 to 2005, initially as a member of Vision Montreal (VM) and later for the rival Montreal Island Citizens Union (MICU). Tétrault has also sou...

 

Public university in Evansville, Indiana, U.S. University of Southern IndianaMottoKnowledge for LifeTypePublic universityEstablishedSeptember 15, 1965 As Indiana State University–Evansville April 16, 1985 As University of Southern Indiana[1]Academic affiliationsCUMUSpace-grantEndowment$155 million (2021)[2]PresidentSteven J. Bridges (interim)ProvostMohammed KhayumAcademic staff677Students9,286 (fall 2023)[3]Undergraduates5,409 (fall 2023)Postgraduates1,854 (fall 2023...