- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经阅读了有关访问者模式的问题 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 操作都可以轻松实现。)
这个模式的重点是不同的。如果
这是起点
您需要支持越来越多的操作
那么您需要对类的代码进行哪些更改才能将应用于指针(或引用)的新操作分派(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,有两种方法:
为每个类和每个操作实现一个虚拟
方法,如write_to_file_type_a
只为每个类实现一个虚拟
方法accept_visitor
,只有一次
您问题中的“不实际接触类(class)本身”意味着,在上面的第 2 点中,这就是将 future 的访问者派往正确类(class)所需的全部内容。例如,这并不意味着访问者将开始编写 getter。
关于c++ - 访客模式添加新功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39808514/
我正在尝试为访问者获取真实IP 当我在 php 中回显时,它为我获取了我的真实IP echo $_SERVER['REMOTE_ADDRESS']; 但是当我尝试在 jQuery 中执行此操作时: $
我目前正在尝试在 Antlr4 Visitor 的帮助下开发一个 JavaScript 编译器。我已经用 Java 实现了这个,但无法弄清楚如何在 JavaScript 中执行此操作。也许有人可以回答
跟踪有多少用户和 guest 在线的最佳方法是什么?我正在制作一个有趣和学习的论坛 现在,我在用户表中有 2 个字段,名为 is_online 和 last_access_time。 如果当前时间是
如何在 Magento 中获取访客 ID?我在管理中的“客户”>“ guest ”下看到它,但如何将其打印在前端的页面上? 我为老客户找到了这个: getId(); ?> 最佳答案 $visitorD
您好,我想为客人设置 session ,我编写了应该执行此操作的脚本,并且确实如此,但仅插入到表部分...我不知道为什么脚本不想设置 session ,如果他拥有所有信息。 最佳答案 在第二个查询中
我想通过继承扩展已声明的访问者,并让运行时环境搜索访问者的后代以执行正确的方法。我可以在 C# 中使用它,但我希望在 C++ 中使用它。我在 g++ 中尝试了以下代码,但未调用后代方法;仅调用基类的方
本文实例讲述了php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法。分享给大家供大家参考。具体如下: 调用方法非常简单。这个也需要数据库来支持。数据库中中文和拼音共存才可以。
我知道这可以在 mysql 中完成,但我希望将 IP 存储在 php 或文本文件中,这对我来说有点困难,因为我不太理解它。 $SESSION 是用来记录日志的,但是如何在点击 html 按钮后将其存储
我正在创建一个 friend 系统,当用户访问另一个用户的个人资料时,他们会看到一个添加 friend 选项,当他们访问自己的个人资料时,他们可以看到其他东西而不是添加 friend 选项,如 TOT
我在我的 Windows 7 机器上使用 VMware 播放器将 Ubuntu 作为 guest 操作系统运行。我遇到的问题是在 Ubuntu 机器上同步时钟。仅当我关闭 VMware 播放器并打开暂
我正在使用虚拟机管理程序。在此我有 DOM0 操作系统,它正在使用 ttyS08250串口驱动。 在此操作系统上,我正在运行一个设备管理器应用程序,该应用程序启动 DOMU 内核,该内核在 8250
我已经在使用 Hyper-V 的 Windows 10 主机系统上安装了 Ubuntu 18.04 作为 guest 系统,我想在全屏模式下使用 guest 系统。据我所知,要调整屏幕大小,我需要在增
MySQL 服务器上的访客数据库如下所示id 是主键整数类型,firstname 和 lastname 是文本类型,访客 id 是整数类型 id firstname lastname
我是一名优秀的程序员,十分优秀!