为了账号安全,请及时绑定邮箱和手机立即绑定

相当于子类的惯用 Go

相当于子类的惯用 Go

Go
狐的传说 2021-12-06 19:36:01
我在 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;};
查看完整描述

1 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

在这种情况下,你可以有一个Edible接口,并且type Fruit struct和type Meat struct每个执行它们。每一个也可以组成,使其包含一个EdibleName,它将提供设置/获取名称的方法和存储空间。


例如


type Edible interface {

    eat() int // common method

}


type EdibleName struct {

    name string

}


// NB getters and setters may not be idiomatic

func (n *EdibleName) getName() string {

    return n.name

}


func (n *EdibleName) setName(name string) {

    n.name = name

}


type Fruit struct {

    pips int

    EdibleName

}


func (f *Fruit) eat() int {

    // ...

    return 0

}


type Meat struct {

    animal int

    EdibleName

}


func (m *Meat) eat() int {

    animal int

    return 0

}


查看完整回答
反对 回复 2021-12-06
  • 1 回答
  • 0 关注
  • 207 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信