c++ - 公开组合成员对象是个好主意吗?

标签 c++ interface composition public class-hierarchy

我有一个顶级类,它使用组合来实例化子模块。用户知道顶级类将具有这些子模块。使子模块对象成为公共(public)成员以便用户可以直接调用它们的函数是个好主意吗?

另一种方法似乎是包装它们的函数调用,以保护子模块不被公开,但没有任何封装好处,因为用户无论如何都需要指定子模块。

这是一个带有子模块厨房和浴室的顶级住宅。

// Public member objects
class Kitchen {
public:
    void turn_on_tap();
    int compute_area();
};
class Bathroom {
public:
    void turn_on_tap();
    int compute_area();
};
class House {
public:
    Kitchen kitchen;
    Bathroom bathroom;
    int compute_area() { return kitchen.compute_area() + bathroom.compute_area(); }
};

//User code:
House house;
house.kitchen.turn_on_tap();
house.bathroom.turn_on_tap();
house.compute_area() // OK
house.bathroom.compute_area(); // may not want user to be able to do this

// Private member objects
class House {
    Kitchen kitchen;
    Bathroom bathroom;
public:
    void turn_on_kitchen_tap() { kitchen.turn_on_tap(); }
    void turn_on_bathroom_tap() { bathroom.turn_on_tap(); }
    int compute_area() { return kitchen.compute_area() + bathroom.compute_area(); }
};

//User code:
House house;
house.turn_on_kitchen_tap();
house.turn_on_bathroom_tap();
house.compute_area();

我更喜欢第一种语法,但它意味着将成员对象公开。

第二种方法似乎很乏味,因为我必须编写额外的函数来包装底层函数调用。而且我失去了很好的点分层取消引用,因为用户知道(并且需要知道)底层层次结构。

编辑:但如果我将它们公开,我将在厨房和浴室中公开我不一定希望用户知道的其他后端公共(public)功能。那么我可能不得不将它们设为私有(private)并使用“friend”,这会变得有点难看。

在上面的代码中添加了 compute_area()。

最佳答案

这取决于。如果房子是一个简单的集合,即:

  1. House 的有效值是 KitchenBathroom 的有效值的任意组合。也就是说,没有要保留的 House 特定不变量。

  2. 各个组件自己正确处理自己的不变量,并通过扩展容器的给定点 1。

  3. 容器的成员函数只是每个组件的微小包装器,甚至只是返回对组件的引用以供修改。

那么是的,一个简单的struct(用于默认的公共(public)访问)确实是合适的。这里的“封装”只是冗长的练习。有时您需要的对象只是一堆粘在一起的东西,没有进一步的逻辑。

因此,这是否是一个好主意,您需要自己检查自己的应用程序。

关于c++ - 公开组合成员对象是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54730979/

相关文章:

FA 中的 C++ "call of overloaded is ambiguous"

c++ - 将对象的指针复制到该对象的新指针中

oop - 纯组合会破坏 OOP 概念吗?

Python:继承与组合

c++ - 异步 ReadDirectoryChangesW 调用阻止线程退出

c++ - qwt图: no plot update on replot

interface - 接口(interface)中的 Java 8 : Spliterator, 迭代器、集合和 "default"实现(名为 spliterator 的重复方法)

Java RMI 客户端

c# - 在 C# 中对抽象类使用接口(interface)

java - 局部引用变量也称为组合吗?