最近,我了解了composite pattern
。我想在我的工作中使用它,我必须实现文件和文件夹类。我意识到像CFile
和Cfolder
这样的子类必须具有相同的属性(name
和size
)。那么我可以将属性放入interface
吗?据我所知,这样做并不好。但是,我不明白为什么我不应该这样做。或者还有其他解决方案吗?
答案 0 :(得分:5)
我想说这不是问题。区别在于,您没有纯接口类,而是拥有抽象基类。但是,如果您希望保留使用接口的灵活性来实现与那些特定成员变量无关的实现,那么您始终可以创建接口类以及抽象基类,具有完全的灵活性。虽然这可能过早变得过于复杂,但如果需要,您可以随后从抽象基础中拆分界面。
using CItemUPtr = std::unique_ptr<class CItem>;
/**
* Interface class
*/
class CItem
{
public:
virtual ~CItem() {}
virtual CItemUPtr findByName(std::string const& name) = 0;
virtual void setHidden(bool a, bool b) = 0;
};
/**
* Abstract base class
*/
class AbstractCItem
: public CItem
{
protected:
std::string name;
std::size_t size;
};
class CFile
: public AbstractCItem
{
public:
CItemUPtr findByName(std::string const& name) override
{
// stuff
return {};
}
void setHidden(bool a, bool b) override {}
};
答案 1 :(得分:3)
这不是一个真正的问题&#34;这是一个好的做法&#34;。通过创建界面,您可以定义标准。问题是,您是否需要实现包含这些数据成员的接口?您处于理解实施的最佳位置,因此您真正是唯一能够回答此问题的人。
作为一般规则,实现接口的类应该是一个黑盒子,外部世界不应该访问任何内部(包括成员数据)。接口定义了能够支持接口所需的通用功能,并且我希望这些实现细节仅作为一般规则隐藏在类的底层实现中。因人而异。
答案 2 :(得分:0)
班级的设计原则应该是:
&#39;不可能从外部打破班级不变量
如果构造函数设置了类不变量,则所有成员都为
坚持阶级不变,这是实现的。
但是,如果班级没有班级不变,则有 公众成员也做到了同样的事情。
// in C++, this is a perfectly fine, first order class
struct Pos
{
int x,y;
Pos& operator+=(const Pos&);
};