相当于子类的惯用 Go

我在 C++ 方面的经验比 Go 多得多。我试图了解复合设计模式如何在 Go 中以惯用方式表达,特别是在参考属性方面。在 C++ 中,我会使用父类来保存一组子类共有的属性和方法。我没有看到这在 Go 中是如何工作的。接口允许我定义要实现的方法,但它不允许我提供默认实现。我必须在实现接口的每个结构中重新实现该方法,并复制每个结构中的所有属性。我不能在接口中保留通用属性,因为接口没有数据元素。你如何在 Go 中进行这种重构?


这是我希望在 Go 中执行的操作的示例(在 C++ 中):


#include <string>


/*

 * Parent class for edible things. Holds the "name" attribute.

 */


class Edible {

public:

        Edible(const std::string &aName):

                ed_Name(aName) { }

        const std::string &name() const { return ed_Name; }


protected:

        void setName(const std::string &aName) { ed_Name = aName; }


private:

        std::string ed_Name;

};


/*

 * Subclass of Edible for fruits. Depends on Edible to store the name.

 */


class Fruit: public Edible {

public:

        Fruit(const std::string &aName,

              const std::string &aPlant):

                Edible(aName),

                fr_Plant(aPlant) { }

        const std::string &plant() const { return fr_Plant; }


protected:

        void setPlant(const std::string &aPlant) { fr_Plant = aPlant; }


private:

        std::string fr_Plant;

};


/*

 * Subclass of Edible for meats. Depends on Edible to store the name.

 * Has attributes for the animal and the cut of meat.

 */


class Meat: public Edible {

public:

        Meat(const std::string &aName,

             const std::string &aAnimal,

             const std::string &aCut):

                Edible(aName),

                me_Animal(aAnimal),

                me_Cut(aCut) { }

        const std::string &animal() const { return me_Animal; }

        const std::string &cut() const { return me_Cut; }

protected:

        void setAnimal(const std::string &aAnimal) { me_Animal = aAnimal; }

        void setCut(const std::string &aCut) { me_Cut = aCut; }

private:

        std::string me_Animal;

        std::string me_Cut;

};


狐的传说
浏览 208回答 1
1回答

潇潇雨雨

在这种情况下,你可以有一个Edible接口,并且type Fruit struct和type Meat struct每个执行它们。每一个也可以组成,使其包含一个EdibleName,它将提供设置/获取名称的方法和存储空间。例如type Edible interface {&nbsp; &nbsp; eat() int // common method}type EdibleName struct {&nbsp; &nbsp; name string}// NB getters and setters may not be idiomaticfunc (n *EdibleName) getName() string {&nbsp; &nbsp; return n.name}func (n *EdibleName) setName(name string) {&nbsp; &nbsp; n.name = name}type Fruit struct {&nbsp; &nbsp; pips int&nbsp; &nbsp; EdibleName}func (f *Fruit) eat() int {&nbsp; &nbsp; // ...&nbsp; &nbsp; return 0}type Meat struct {&nbsp; &nbsp; animal int&nbsp; &nbsp; EdibleName}func (m *Meat) eat() int {&nbsp; &nbsp; animal int&nbsp; &nbsp; return 0}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go