gpt4 book ai didi

c++ - 访客模式添加新功能

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:12:01 25 4
gpt4 key购买 nike

我已经阅读了有关访问者模式的问题 https://softwareengineering.stackexchange.com/questions/132403/should-i-use-friend-classes-in-c-to-allow-access-to-hidden-members .在我读过的一个答案中

Visitor give you the ability to add functionality to a class without actually touching the class itself.

但是在访问过的对象中,我们必须添加新的接口(interface),所以我们实际上“接触”了类(或者至少在某些情况下放置了 setter 和 getter,同时改变了类)。

我将如何在不更改访问类的情况下向访问者添加功能?

最佳答案

访问者模式确实假设每个类接口(interface)都足够通用,因此,如果您知道对象的实际类型,就可以从类外部执行操作。如果这不是起点,访问者确实可能不适用。

(请注意,此假设相对较弱 - 例如,如果每个数据成员都有一个 getter,那么对于任何 const 操作都可以轻松实现。)

这个模式的重点是不同的。如果

  1. 这是起点

  2. 您需要支持越来越多的操作

那么您需要对类的代码进行哪些更改才能将应用于指针(或引用)的新操作分派(dispatch)到基类。

为了使这更具体,请使用 classic visitor CAD example :

Consider the design of a 2D CAD system. At its core there are several types to represent basic geometric shapes like circles, lines and arcs. The entities are ordered into layers, and at the top of the type hierarchy is the drawing, which is simply a list of layers, plus some additional properties.

A fundamental operation on this type hierarchy is saving the drawing to the system's native file format. At first glance it may seem acceptable to add local save methods to all types in the hierarchy. But then we also want to be able to save drawings to other file formats, and adding more and more methods for saving into lots of different file formats soon clutters the relatively pure geometric data structure we started out with.

访问者模式的起点是,比如说,一个圆,有足够的 setter/getter 来满足它的细节,例如它的半径。如果不是这种情况,那么确实存在问题(事实上,它可能是一个设计糟糕的 CAD 代码库)。

不过,从这一点开始,在考虑新的操作时,例如写入文件类型 A,有两种方法:

  1. 为每个类和每个操作实现一个虚拟方法,如write_to_file_type_a

  2. 只为每个类实现一个虚拟方法accept_visitor,只有一次

您问题中的“不实际接触类(class)本身”意味着,在上面的第 2 点中,这就是将 future 的访问者派往正确类(class)所需的全部内容。例如,这并不意味着访问者将开始编写 getter。

关于c++ - 访客模式添加新功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39808514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com