-1

我正在做一些项目,需要一些简单的建议。

我有一个基类,以及从该基类派生的 6 个类。

这 6 个派生类中的 5 个应该有两个 private int,但第 6 个只需要一个 private int。当然,成员函数get()set()两个整数(第 6 个仅get()适用set()于第 1 个int)。

我的问题是:我应该有一个带有两个ints 和set()andget()函数的基类,还是应该有一个带有一个intandset()get()的基类int,而所有其他派生类(除了第 6 个)还有一个int和两个以上的方法?

4

3 回答 3

3

我的问题是:我应该有一个带有两个ints 和set()andget()函数的基类,还是应该有一个带有一个intandset()get()的基类int,而所有其他派生类(除了第 6 个)还有一个int和两个以上的方法?

假设公共继承,这完全取决于您的设计要求。问问自己:我是否需要int通过基类引用来访问第二个?如果答案是yes,那么它需要在那个基类中。如果答案是否定的,那么它不应该在那个基类中。

我理解不多次实现其他数据的动机,但这是一个实现工件,应该在实现中解决(你可以从另一个实现它的基础私下继承),而不是在你的设计中。


也就是说,请注意,如果您需要 setter 和 getter,那么您做错了

于 2012-08-17T09:52:31.863 回答
3

您的问题的答案取决于不同类的模型以及int数据成员的含义。让我们假设您的派生类确实应该从基类继承(这是一个很大的假设)。我还假设我们在这里讨论的是公共继承。

当然,基类不能同时包含两个int数据成员。如果您的层次结构正确,则第二个成员仅对此类的某些对象有意义(特别是对您的第 6 类对象没有意义)。请记住,公共继承对 IS-A 关系建模:基类的所有部分也必须适用于所有派生类。

现在是第一个数据成员。它在所有派生类中是否意味着相同?对于您可能拥有的任何其他派生类,这是否也意味着相同?你的基类的所有对象都应该有这个成员吗?如果是这样,它应该出现在基类中。

这里最重要的是要有一个具有正确继承的良好设计。如果你有这个,那么你的问题的答案是微不足道的。如果你不这样做,答案就无关紧要,因为你必须先修复你的设计。

于 2012-08-17T09:23:47.143 回答
0

你当然不应该在你的类中有多余的方法。我建议创建第 7类,作为其他 5 类的基础:

class BaseLevelOne { protected: int X; };
class BaseLevelTwo : public BaseLevelOne { protected: int Y; };

class One : public BaseLevelOne { /* get & set */ };
class Two /* Three, Four, etc. */ : public BaseLevelTwo { };

这样你:

  • 不必写第二int五遍
  • 不必在第一类中有多余的成员

但是,如果您确实说明了您想对这些类做什么,那么我的回答可能会更精确,更适合实际用例。

于 2012-08-17T09:20:24.473 回答