6
class Room{
  public:
    void ColorRoom(){};
};

class House{
  public:
    Room* GetRoom(){return &m_room;}
  private:
    Room m_room;
};

1)房间没有房子就不能存在,房子“有”房间。(组合)
2)另一种为房间着色的方法是在 House 中有一个方法,该方法将调用 Room 中的 ColorRoom 方法,但这更多的是委托。(我想避免这种情况)

我看到的唯一方法是上面的方法,但看起来返回对私有成员的引用正在破坏 OOP。这是一个好的设计吗?

4

6 回答 6

5

问题是您没有明确公开您的私人成员。您的 API 只显示了获取房间的方法,而消费者不知道 House 是否正在创建该房间、返回私有字段中的内容或从 Web 服务获取房间。那是可靠的OO。

于 2010-01-26T18:50:49.140 回答
4

总的来说,你很好,因为它自己House创建了成员变量m_room——它不需要消费者在实例化后调用某些东西。这遵循项目在实例化后立即可用的模式(它不需要像设置房间或其他任何特殊操作)。

我确实有一些小问题:

class Room
{
public:
    // virtual method to allow overriding
    virtual void ColorRoom(){};
};

class House
{
public:
    // Returning a non-const pointer in C++ is typically a bad smell.
    const Room& Room() const { return m_room; }
    // Allow for assignment and manipulating room, but breaks const-ness
    Room& Room() { return m_room; }
    // Facade method for houses with more than one room
    // You can forward parameters or come up with room-painting schemes, but you should
    // not require that a House has a Room called Room().
    virtual void ColorAllRooms()
    {
        m_room.ColorRoom();
    }
private:
    Room m_room;
};
于 2010-01-26T18:47:00.787 回答
4

我喜欢 NickLarsen 的回答,但我有一点要补充:

不要让对象的私有字段在该对象之外更改。如果您必须更改Room对象,请使用委托。也就是说,如果Room有一个SetFloorColor(Color _color);方法,那么你应该House调用

SetRoomFloorColor(Color _color){ m_room.SetFloorColor( _color ); }
于 2010-01-26T19:01:08.913 回答
2

手术发生在房间里,而不是房子里。如果您可以通过房屋返回对房间的不可变引用,然后可以对其进行操作,那么您就没有破坏 OOP。

于 2010-01-26T18:47:51.440 回答
2

尽管我喜欢 NickLarsen 的回答,但我要指出另一件事:房间不会自己着色(或油漆)。该动作通常由 Painter 完成,Painter 显然不是房间的成员。现在画家可以为整个房子着色,或者画家可以只在一个房间上工作。

在这种情况下,我建议房间具有颜色属性,并且更改该颜色的行为由另一个对象在外部处理。

这个想法建议 Color 属性必须是一个公共属性,并且您可以将要更改的房间的引用传递给 Painter 对象。

于 2010-01-26T19:11:53.570 回答
0

暴露私有成员会减少内聚并增加耦合。一般来说,你应该避免这样的代码:

selection.getRecorder().getLocation().getTimeZone(); 

该代码的可维护性较差,并且违反了得墨忒耳法则

于 2010-01-27T14:10:45.760 回答