我在 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
}
- 1 回答
- 0 关注
- 207 浏览
添加回答
举报
0/150
提交
取消