2017-12-26 15 views
1

Goはオブジェクト指向の言語ではないことを理解していますが、thisのようにIrisコントローラに継承構造を実装しようとしています。そのための私の主な動機は、繰り返しを避けることです。これまでのところ、私のために働いています。たとえば、次のコードを見てください。Golang Iris:親コントローラのモデルを子コントローラのモデルに初期化する

// APIController.go (package Controllers) 
type APIController struct { 
    mvc.C 
} 
func (c *APIController) Post(data map[string][]string) ([]byte, error) { 
    data_parsed := c.ParseFormData(data) 
    return json.Marshal(data_parsed) 
} 

// UserController.go (package Controllers) 
type UserController struct { 
    mvc.C 
    *APIController 
} 

func (c *UserController) Post() ([]byte, error) { 
    return c.APIController.Post(c.Ctx.FormValues()) 
} 

これまでのところとても良いです。

しかし、私は同じ戦略をモデルに再現するのが難しいと感じています。これは私がこれまで

// Model.go (package Models) 
type Model struct { 
    Id   string `json:"_id"` 
    Created_at string `json:"created_at"` 
    Updated_at string `json:"updated_at"` 
    Deleted_at string `json:"deleted_at"` 
} 
// implements further set of functions to be used by 'child' models... 

// User.go (package Models) 
type User struct { 
    *Model 

    First_name string `json:"first_name"` 
    Last_name string `json:"last_name"` 
    Email  string `json:"email"` 
    Username string `json:"username"` 
    Password string `json:"password"` 
    Last_login string `json:"last_login"` 
} 


// APIController.go (package Controllers) 
type APIController struct { 
    mvc.C 
    Model Models.Model 
} 

// UserController.go (package Controllers) 
type UserController struct { 
    mvc.C 
    *APIController 
} 

func (c *UserController) Post() ([]byte, error) { 
    c.APIController.Model = new(Models.User) //WRONG! 
    return c.APIController.Post(c.Ctx.FormValues()) 
} 

UserControllerでは*Models.Userを通過する間、あなたが、APIControllerはタイプModels.Model期待している見ることができるように行われてきたものです。最終的な目標は、APIControllerの汎用モデルを任意のコントローラから取得し、Models.Modelで定義されているすべての関数を呼び出すことができるようにすることです。この関数をどこでも呼び出す必要はありません。

これは可能ですか?そうでない場合、コードを繰り返さないようにするにはどうすればよいでしょうか?

更新

継承と、単一の親モデルを使用して、親APIControllerに、私は私のフィルタ/ CRUDロジックを複製避けたいことを使用することにより。私はレコードを保存したい場合は代わりにUserController内部User.Save(input_data)の使用例については、UserControllerの内側に、そして、Saveは理想的Models.Modelの内側とAPIControllerから定義する必要があり、私は子供のコントローラから同じ呼び出しを行うのではなく、Model.Save(input_data)を呼び出すことができますよ個別に

+0

私はあなたがc.APIController.Model'は、あらゆるタイプのモデルを含むように 'たいことを理解し、しかし、どのようにモデルを使用したいのですか? – md2perpe

+0

@ md2perpeは、正確な使用法についての質問を更新しました。 – Muavia

答えて

1

最初に構造体ではなくインタフェースModelを作成してください。それは、すべてのモデルに共通である必要があり、すべてのメソッドが含まれてい:

type Model interface { 
    // Common methods 
} 

その後、限りUserは、これらすべてのメソッドを実装して、あなたがSave可能性が一般的な方法の

c.APIController.Model = new(Models.User) // Now works! 

つを持つことができます。そうでなければ作るSaveは非法:

func Save(m Model) error { 
    ... 
} 
+0

私は 'APIController.Model'を' interface {} 'として定義する行に沿って実験していましたが、そのメソッドには欠点がありました。あなたのものはより良い選択肢のように思えます。 – Muavia

関連する問題