ヴァルド ハイエース/レジアスエース 200系 3型 (H22.7~) ワイドボディ ロング/スーパーロング Executive Line CORNER PANEL ブラック(209) 塗装済み【新作入荷】

Oct 6, 2015 by hondata

Go言語におけるポリモーフィズム

Go言語は厳密にはオブジェクト指向プログラミング言語ではありませんが、 インタフェースを用いることでポリモーフィズムを実現することができます。

ヴァルド ハイエース/レジアスエース 200系 3型 (H22.7~) ワイドボディ ロング/スーパーロング Executive Line CORNER PANEL ブラック(209) 塗装済み【新作入荷】

CUSCO (クスコ) type MZ LSD フロント 1way(1&1.5way) 品番:LSD 124 B トヨタ セリカ 型式:ST162 年式:1985.8~1989.8CUSCO クスコ LSD455C15 三菱 CY4A ギャランフォルティス 1.5way(1&1.5way) リミテッドスリップデフ type-RS 【低イニシャルで作動!】EXEDY(エクセディ) CARBON-D(ツイン) ランサーEvo.X CZ4A用 (圧着力13000) ORC(小倉レーシングクラッチ)メタルクラッチ ORC409(シングル) ミツビシ ランサーエボリューション CN9A(EVO4) 4G63用 ニスモ LSD GT LSD タイプ:2WAY シルビア S15 SR20DE 送料無料 代引無料 CUSCO (クスコ) type RS LSD フロント 1way 品番:LSD 901 F トヨタ ヴィッツ 型式:NCP131 年式:2010.12~
トラスト Greedy 電子パーツ用 ECU延長ハーネスH-8 S2000 AP1用永井電子/ULTRA CAN-BUSアダプター メルセデス・ベンツ CLクラス/C215 GH-215*** 2002年11月~2005年09月永井電子 ULTRA(ウルトラ) ミラーサポートシステム ニッサン プリメーラ P12用 ☆BOSCH・eXchangeリビルト・国産車用オルタネーター☆代表純正品番:【マツダ】SLA1-18-300代表他社品番:【三菱】A2T73676BOSCH品番:0986JR14599UB※コア返却必須です [siecle] シエクル MINICON PRO ミニコン プロ ヴァンガード GSA33W 2GR-FE 07.08~ 送料無料 ※沖縄・離島は除く APEX(アペックス)パワーFCブーストコントロールキット マツダ RX-7 FD3S (I~III型) 13B-REW 91/12~95/11 用
タナベ/TANABE マフラー MEDALION TOURING 品番:HWFX10RW-GA スバル インプレッサスポーツ GP7 FB20 2011年12月~ブリッツ NUR-SPEC Exhaust System K スズキ ワゴンRスティングレー(WAGON R STINGRAY) MH23S K6A マフラー【ZEES Velss-W】18系クラウン【スタンダード:ハーフステンレス】 【 トヨタ ノア 2.0L 型式 ZRR85G エンジン形式 3ZR-FAE 年式 2014/1- グレード X 4WD NA CVT車 ≪ テール 90Φ オーバルデュアル ワンピース構造 ≫】【 タナベ メダリオン ユーロチューンGAマフラー 】【 品番 ET80SS-GA 】 [フジツボ]ACR55W エスティマ アエラス(2.4/4WD)用マフラー(パワーゲッター) ARM/Alpha Replacement Muffler BMW E34 520i 24V 純正タイプ補修用マフラー R/マフラー
■柿本 マフラー 柿本R 車検対応 トヨタ MR-S ZZW30[1ZZ-FE] (1)GH-ZZW30(2)TA-ZZW30 (1)99/10~00/8(2)00/8~07/7【TS356】【smtb-k】【kb】5ZIGEN マフラー LAX TOURING LAT-062 トヨタ bB CBA-NCP30 1NZ-FE 2004年02月~TOMMYKAIRA トミーカイラ PREMIUM Edition ヴェルファイア GGH ANH ATH 後期 プレミアム 01S センターパイプ ハーフステンレス ステンレス SUS304 アルスター1T002Z10 TOMMYKAIRA トミーカイラ tanabe メダリオン Gフォーダンマフラー エスティマ DBA-ACR50W 06/1~10/3 2AZ-FE S 【天野】 シーマ 型式:F50 年式:H13~22 エクセレント [カラー:ベージュ ウェーブ] 【カー用品:内装パーツ:フロアマット】【AMANO】 クーポンで5%OFF!6/16 14:59迄★【今だけさらに5%off】BRIDE スーパーシートレール ROタイプ ダイハツ D032 左座席
アドミレイション アルタモーダ ダッシュマット GDKMI041A タイプ:ストライプ,スクエア,ダイヤ ミツビシ eKワゴン H81W 2001年10月~2006年08月アドミレイション アルファード 30系 アルタモーダ ダッシュマット LUXURY スクエア 本体カラー:グレーホンダツインカム(フィールズ) 軽量ボンネット(平織りカーボン ノーマル形状) インテグラタイプR(DC5)用 【DR17V NV100クリッパー | シフトスポーツ】NT100クリッパーバン DR17V 慶番ダッシュボードマット レッド×イエロー ■送料無料■マツダ スクラムワゴン DG64 専用 毛皮風ファーハイパイルダッシュボードマット【05P010ct16】 トヨタ セルシオ UCF30系[後期] 車種専用 ムートン調 ハイパイル ダッシュボードマット ダッシュマット 【05P05Nov16】
カーマット 荷室用 日産 エルグランド 22年8月~26年1月 ラゲッジマット-シャギーマルーンREAL(レアル) ステアリング ノア・ヴォクシー(70/75系)4本スポーク車 ウッド&本革レザー (パールレッド/レッド)[REAL] レアル ステアリング 【 スペーシアカスタム [MK32S/MK42S] (2013年3月~) 】 パッションオレンジ カーマット フロアマット 日産 スカイライン・セダン(4ドア) 16年11月~19年10月 4WD/フットレスト無/両席マニュアルシート-LUXブラック エスティマハイブリッド フロアマット 【プレミアムタイプ】 カーマット 直販 高級 ラグマット 絨毯 ラグ生地 内装パーツ 内装品 カー用品 車用 専用設計 すべり止め ブラック ベージュ 黒 土足禁止 土禁 【Dotty】 LUXUR-VIP シートカバー エスティマ (8人乗り)にお勧め! ACR/GSR5#W系 H18/01→H20/12 品番:2611
【80/85 ノア | シンケ】ノア 80/85系 車種別専用ラブベッド コットンタイプ ベットカラー:ゼブラ オプションクッション無SHINKE / ラブベッド [ダークグレー] コットン/レザータイプ シャトル■KAROフロアマット クエスト トヨタ エスティマ GSR、ACR5#W H18/01~ 【品番:2303】リアゲートのみ(7・8人乗り共通、リア2列目使用時・オプションデッキボード装着車用) モダン シートカバー ウィッシュ 7人 NE系 X/E 2003年 01月~2009年 03月 G,X,X"Eパッケージ,X-Limitedに対応 ヌブリノ-生地 【グランディス シートカバー】Clazzio/クラッツィオ NA4W グランディス H17/5~H19/7 クラッツィオネオ EM-0772 DIXCEL(ディクセル)FF車・サーキット専用リア アンチロックパッド RNタイプトヨタ カローラレビン AE111 リア用
ファミリア【BJ5P】【00.9~03.10】4WD車APPブレーキパッド【KG-3309】前後1台分セット【適合詳細要確認】【送料無料】ブレーキ パッド Projectμ(プロジェクトミュー) TYPE NS-C ブレーキパッド フロント AB44S カルタス (88.9~)■Projectμ プロジェクトミュー N1-Racing(N1レーシング)4輪ディスク車用1台分◆【三菱 エクリプス D32A/D38A】【 95.2~】F551/R537【smtb-k】【kb】 ブレビス【JCG15】【98.5~】APPブレーキパッド【KG-3309】前後1台分セット【適合詳細要確認】【送料無料】 ホンダ N-BOX/N-BOX カスタム JF1 11/12~13/12 DIXCEL(ディクセル) ブレーキシュー RGMタイプ リア用 3351082 プロジェクトμ RACING999 プリメーラ/プリメーラカミノ HNP11 (4WD) 95.9~97.9 リア用
トヨタ ブレイド 07/7~12/4 GRE156H (MASTER) ACRE(アクレ) ブレーキパッド PC3200 672 フロント用 左右セットブレーキ[Projectμ] プロジェクトミュー ブレーキパッド RACING 999 リア用 【ボルボ V40 T5 R-デザイン MB5204T/MB420 13/02~ ローターFr:φ320】 本州は送料無料 北海道は送料500円(税別) 沖縄・離島は送料1000円(税別)プロジェクトμ ブレーキパッド B-SPEC 1台分セット セリカ ST202C 94.8~97.12 プロジェクトミュー ENDLESS ブレーキパッド SSM リア ホンダ フィット GE8 (4輪ディスク) EP210SSM ★色番号塗装発送【50 プリウス | ヴェルティア】プリウス 50 リアスポイラー マニホールド エキゾースト ■ 『写真No1のみ』 スズキ純正部品 ワゴンR/ワイド、プラス、ソリオK6A:TURBO MC22S-5 K6A:TURBO MC22S適合年式[平成14年08月~15年04月]【品番】 14110-85G00 ^6^
ZECREATE BMW 5シリーズ E60 M5 kohlenstoff カーボンファイバーフロントスポイラー【BENZ A W176 | スターズ】ベンツ A-Class W176 リアディフューザー FRP 塗装済:コスモスブラックノブレッセ オデッセイ RB3 グリル一体式フロントバンパー (タイプユーロNEO) MC後/カメラ対応 塗装済み 【86 - ハチロク - | グラージオ】TOYOTA 86(ZN6) MODEL-II(2016.7~ ) ウインドウフレームガーニッシュ 標準カラー(シルバーメッキ調) ヴァンガード GSA33W 前期 350S エアロ3点セット 塗装済 ゼウス ラヴライン エブリィバン(エブリーバン) DA64V エアロ3点セット 塗装済 レーベルナンバーツー フィール
FABULOUS JB1/2 LIFE 後期 SIDE STEP 塗装済み「複数種類あり」 フロア の マツト ■ 『図の略番 95011 のみ』 スバル純正部品 インプレッサ(GP XV) 適合年式[平成24年07月~next]【品番】 95011FJ130 ^j108^FABULOUS Ferrari F430/F430 Spider VARIOUS SWAROVSKI SEAT ロゴエンブレム COLOR:CLEAR TAKE OFF エッセ(L235S/L245S) エアロボンネット フルカーボン/裏表 ダクトB付き 【★送料無料】 【200 ハイエース | エルエックスモード】200系 HIACE MC後 フロントスポイラー 素地 コントローラー[一式] EPV ■ 『写真No51のみ』 スズキ純正部品 その他 モ-ド 3DR CN22S適合年式[平成03年08月~07年09月]【品番】 33940-50E11 ^43^
MIC アイシス ダイヤキルトレザーピラー 10P ピンク 塗装済み【正規輸入代理店】CURT カート VW (フォルクスワーゲン) Passat (パサート)4モーションワゴン/セダン 2000-2005年クラス1 トレーラーヒッチ(ヒッチメンバー/レシーバーヒッチ)※1-7/8インチボール・ユーロマウント付タイトヒッチ エクストレイル スチールタイプ※代引不可 ※受注生産商品、返品・キャンセル不可 ※本州送料2160円※北海道、沖縄、九州、四国特別送料 【純正】TOYOTA REGIUS ACE トヨタ レジアスエース【型式は下記参照】  フロントメッキガーニッシュ[08423-26140] 【CHARGE SPEED/チャージスピード】LANCER EVOLUTION X CZ4A BottomLine Type-1 フロントボトムライン(カーボン製) 【SILK BLAZE/シルクブレイズ】セルシオ 30前期 プレミアムライン フロントハーフスポイラー 純正色塗装済(ソリッドカラー)
。 例えば以下のコードを見てください。

package main
import "fmt"
type Dog struct {}
func (d *Dog) Cry() {
 fmt.Println("わんわん")
}
type Cat struct {}
func (c *Cat) Cry() {
 fmt.Println("にゃーにゃー");
}
func MakeDogCry(d *Dog) {
 fmt.Println("鳴け!");
 d.Cry();
}
func MakeCatCry(c *Cat) {
 fmt.Println("鳴け!");
 c.Cry();
}
func main() {
 dog := new(Dog)
 cat := new(Cat)
 MakeDogCry(dog)
 MakeCatCry(cat)
}

犬と猫の構造体を用意して、それぞれ鳴かせてみました。でもこのコードは冗長です 。鳴かせるための関数が重複しています。

「鳴く」という動作は(実際は例外はいるかもしれませんが)動物ならばみんなできる動作なので、 これをインタフェースに括り出してみましょう。

package main
import "fmt"
type Animal interface {
 Cry()
}
type Dog struct {}
func (d *Dog) Cry() {
 fmt.Println("わんわん")
}
type Cat struct {}
func (c *Cat) Cry() {
 fmt.Println("にゃーにゃー");
}
func MakeAnimalCry(a Animal) {
 fmt.Println("鳴け!");
 a.Cry();
}
func main() {
 dog := new(Dog)
 cat := new(Cat)
 MakeAnimalCry(dog)
 MakeAnimalCry(cat)
}

Animalインタフェースを用いて鳴かせる関数を一つにまとめることができました。

ヴァルド ハイエース/レジアスエース 200系 3型 (H22.7~) ワイドボディ ロング/スーパーロング Executive Line CORNER PANEL ブラック(209) 塗装済み【新作入荷】

Animalインタフェースを作成した際、Dog構造体やCat構造体には何も変更を加えていません。 にも関わらず、DogやCatはMakeAnimalCry関数において「Animalインタフェースを実装した」とみなされています。

インタフェースの実装に明示的な宣言が必要なJavaやC#と違い、 Go言語ではインタフェースが必要とするメソッドをすべて実装した時点で、自動的にそのインタフェースを実装したとみなされます。

このような、振る舞いから型を決める仕組みはダックタイピングと呼ばれ、(仕様は多少違いますが)Ruby等の言語でも採用されています。

interface{}型について

もう一度、Animalインタフェースの定義に注目してみましょう

type Animal interface {
 Cry()
}

これはtypeキーワードによる型定義になっていて、「Animal」は新しい型名です。

。 すなわち、以降の部分は「Cryメソッドを実装したインタフェース」を表す型名になっています。

同様に、「何のメソッドの実装も要求インタフェース」を表す型名も存在します。

interface{}

このinterface{}型は実装の条件が無いので全てのオブジェクトはinterface{}型を実装していることになります。 これを利用すると、「どんな型も引数に取ることができる関数」や、「どんな型も返すことができる関数」を作ることが出来ます。

例えばfmt.Println関数はどんな型も引数に取ることができる関数の一つです。

// Go言語ソースコードより抜粋
func Println(a ...interface{}) (n int, err error) {
// 省略
}

ヴァルド ハイエース/レジアスエース 200系 3型 (H22.7~) ワイドボディ ロング/スーパーロング Executive Line CORNER PANEL ブラック(209) 塗装済み【新作入荷】

interface{}型は何の振る舞いも要求しないため、そのままではメンバメソッドの呼び出しやメンバ変数へのアクセスをすることが出来ません。 これを解決するためには、interface{}型を別の型とみなして扱う必要があります。 そのために、Go言語には型アサーションという仕組みが用意されています 。

func MakeSomeoneCry(someone interface{}) {
 fmt.Println("鳴け!");
 a, ok := someone.(Animal)
 if !ok {
 fmt.Println("動物では無いので鳴けません。")
 return
 }
 a.Cry()
}

上記は先述のMakeAnimalCry関数をさらに拡張し、どのような型も受け取れるようにしたものです。 3行目が型アサーションの構文になっていて、interface型の変数someoneをAnimal型とみなして変数aに格納しています。

someoneがAnimal型とみなせる場合(Cryメソッドを持つ場合)、変数aにはAnimal型のsomeoneが格納され、二つ目の戻り値okはtrueになります。 そうでない場合は変数aへは値が代入されず、二つ目の戻り値はfalseになります。

Tags: