以下代码中定义的LinkedListItr类真的有用吗,书上这样写是不是违背了抽象的原则。
这是std::list\u0026lt;T\u0026gt;::iterator,这种东西也不是不存在。但是既然不实现一个接口(譬如说C#里面的IEnumerable\u0026lt;T\u0026gt;),那把一个类写成这样没有什么实际价值。
■网友
1. 迭代器是把“遍历操作抽象出来供外部使用”。你这个例子的有个很大的问题是这个迭代器没有去实现一个更为抽象的迭代器接口(比如说java.util.Iterator)。导致所有使用这个迭代器的客户代码都只能基于这个具体类去写,事实上没有抽象可言。2. 数据结构结点内部的增删查改操作不需要通过本身的迭代器去实现。反而是迭代器如果需要支持增删改的话,应该通过调用(委派)结点或集合上的方法去实现。否则迭代器需要知道集合的内部实现细节,形成跨类的强耦合。所以你这个例子中,ListNode代码是没问题的。但迭代器因为没有基于一个抽象的接口,根本就没有达成“抽象”的作用。在现实场景中唯一意义就是作为一个“统一的遍历入口”。假如所有遍历这个集合类的客户代码都自觉使用这个迭代器的话(不太可能),以后如果对于这个集合类的遍历方案有改动的话,可以改在这里。但由于所有客户代码都直接指向这个具体的迭代器,所以改动会影响所有的客户代码,而不能实现新旧方案并存。一般来说没人会这么搞(迭代器不去实现一个抽象接口),你都实现到这个地步了,挂一个接口就能海阔天空,不挂就没啥卵用。这就相当于考试只答题不写名字。
■网友
redis中用过这种数据模型,实际开发中用的很少
推荐阅读
- 孕妇|多半是贫血了,需尽早应对!孕妇身体出现以下4个异常
- 婴儿|美国儿科学会: 1岁以下婴儿不推荐学习游泳
- 怎样对别人的代码进行适当修改使他永远也找不到问题出在哪
- 车市百晓生|拥出众实力方能定义市场 试驾吉利星瑞
- 环球车讯网|软件能否定义汽车
- Tensorflow 中咋定义自己的层呢
- 网通社|喜欢TNGA架构平台的注意!新款丰田雷凌这回也有了 即日起就可以下订
- 名单|收藏:3岁以下宝宝的最佳非处方药(OTC)名单。
- 异乡好居说程序员删除代码是未经证实的传言吗
- 怎样看待ofo在单车上标出“禁止十二周岁以下儿童骑车”的警示语
