假设有一些界面,例如一个几何图形,它有3个继承体:正方形、三角形、五边形。让指向它们的指针存储在一个指针向量中。如果我们无法通过多态指针区分形状的类型,那么问题就出现了,如何将所有方块着色为红色。我知道2个解决方案:
- 演讲者演员,这是某种拐杖
- 在物体内部添加视场,这也是值得怀疑的。
那么如何只将方块涂成红色呢?一般如何处理这样的问题?
假设有一些界面,例如一个几何图形,它有3个继承体:正方形、三角形、五边形。让指向它们的指针存储在一个指针向量中。如果我们无法通过多态指针区分形状的类型,那么问题就出现了,如何将所有方块着色为红色。我知道2个解决方案:
那么如何只将方块涂成红色呢?一般如何处理这样的问题?
不可能,这不是多态列表的用途:-)
一般来说,“告诉,不要问”原则在这里可以发挥作用。当我们不询问每个对象它是什么,也不根据它回答的结果告诉它要做什么,而是立即将这个逻辑放入对象中,让它自己决定是否满足条件并具有必要的能力。
通过这种方式,当外部系统甚至不关心知道正方形是什么,而只是一个“几何图形”(本质上是指针向量声明的东西)时,我们可以更好地封装逻辑和多态性。
第二个并不比第一个好(也许第二个更快;如果这对您很重要,请查看个人资料)。第一个并没有什么问题,有时它是最好的解决方案。
共有三种解决方案,每种方案都有其各自的情况:
dynamic_cast
(或比较
typeid
,如果您需要特定的类而不是其后代)(或指示类类型的字段,如果这在您的情况下更好)
1 - 默认选项。
2.3 - 如果该函数不属于父函数。例如,如果在整个应用程序中使用类,并且在一处需要这样的着色。那么把她拖到一个共同的父母身边就奇怪了。(或者如果父级是库父级且无法更改。)
如果有地方可以存储此函数,则 3 会更方便(特别是如果您自己创建对象 - 那么您可以立即放置正确的函数,而无需研究类型
dynamic_cast
),并且 2 - 如果对象存储在外部某处,并且没有可以将元数据添加到其中。ov有热心的反对者
dynamic_cast
(见下一个答案,无意冒犯@Kromster),显然是因为他们在智能书中被骂。但我还没有收到任何人关于在上述情况下该怎么做的正常解释,当您无法更改父级,或者功能太具体而无法将其拖到那里时。为“占位符”定义一个基类:
将纯虚函数添加到 Shapes 的基类中
fill
:在 Shape 的后代中,重写此函数:
仅为正方形定义“填充物”:
看来就是这样了:)
SquareRedFiller
我们只重写了正方形的运算符,其余的都是默认实现(不执行任何操作)。