处理组合关系中的变量

3

我目前正在重新设计一个C++项目,并希望就"拥有关系"(组合)的类在需要访问属于父类的变量时如何处理变量征求一些意见,例如:

计算机对象拥有一个网络卡对象。计算机对象拥有一个所有者变量。例如

class Computer {
        string get_owner(); // getter as an option?
    private:
        std::string owner = "baylesj";
        NetworkCard nic;
}

class NetworkCard {
    public:
       NetworkCard(Computer *parent);
       send_packet();
       broadcast_owner(send_packet(m_parent->owner)); // this is kind of ugly
    private:
        Computer *m_parent;
}

假设我有一个需要所有者的网络卡函数。在初始化计算机时,将所有者作为网络卡的成员变量传递是否更好?还是应该在NetworkCard中有一个父指针,可以访问Computer的成员变量,Getter/Setter或其他关系?我知道在子类中拥有指向父类的指针是相当常见的做法,但这是一个好主意/合适的OOP吗?
**计算机只是一个例子,在现实生活中它可能是其他东西,所以不要过于纠结。
1个回答

3

我看到你认识到减少不必要的耦合是可取的。为了做到这一点,您可以设计NetworkCard类来不知道父类的实现细节。以下是一种在网络构建时传递广播名称的方法:

class Computer {
    public:
        Computer(std::string const &owner) : m_Owner(owner), nic(owner)
        {
        }

    private:
        std::string m_Owner;
        NetworkCard nic;
};

class NetworkCard {
    public:
       NetworkCard(std::string const &owner)
       {
           broadcast_owner(owner);
       }

       send_packet();
       broadcast_owner(std::string const &owner);

    private:
};

如果你发现有太多这样的变量需要作为构造函数参数传递(我喜欢不超过两三个),那么你可能会发现组合不是解决问题的正确工具。通常情况下,参数数量很少,除非它实际上是一个“is-a”关系,在这种情况下,继承可能是更好的工具。


谢谢,这帮助我朝着正确的方向前进。我特别感谢检查构造函数参数数量以确定是否应该是“is-a”的提示。 - jaypb
1
很高兴它对你有帮助。当你完成几个后,你会对它有一个好的感觉。 - Amardeep AC9MF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接