概述:封装集合就是把集合封装其他,只提供给调用端接口。其调用端不能任意修改集合,耦合性更加明确。
我们在很多时候吧一些不必要的操作暴露给调用端,只需要给他们所需要的操作或数据就行,这样的叫做封装。下文是我们提供一个Ilist的集合,大家知道Ilist具有对集合的所有操作,这样提供给调用方会造成很多不必要的隐患,所以我们要重构 封装。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SCADA.HMI.Windows { public class Order { private List<Orders> _orderses; private double _orderTotal; public Order(List<Orders> orderses) { _orderses = orderses; } public IList<Orders> Orderses { get { return _orderses; } } public void Add(Orders _orders) { _orderTotal += _orders.OrderTotal; _orderses.Add(_orders); } public void Remove(Orders _orders) { _orders = _orderses.Find(o => o == _orders); if (_orders == null) { return; } _orderTotal -= _orders.OrderTotal; _orderses.Remove(_orders); } } public class Orders { public double OrderTotal { get ; private set; } }
我们要把Ilist换成IEnumerable,大家知道包括一个返回值为IEnumerator的GetEnumerator()方法,所以这样只能遍历取出它的值,而不能对这个集合进行改变。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace SCADA.HMI.Windows 7 { 8 9 public class Order 10 { 11 private List<Orders> _orderses; 12 13 private double _orderTotal; 14 15 public Order(List<Orders> orderses) 16 { 17 _orderses = orderses; 18 } 19 20 public IEnumerable<Orders> Orderses 21 { 22 get 23 { 24 return _orderses; 25 } 26 } 27 28 public void Add(Orders _orders) 29 { 30 _orderTotal += _orders.OrderTotal; 31 _orderses.Add(_orders); 32 } 33 34 public void Remove(Orders _orders) 35 { 36 _orders = _orderses.Find(o => o == _orders); 37 if (_orders == null) 38 { 39 return; 40 } 41 _orderTotal -= _orders.OrderTotal; 42 _orderses.Remove(_orders); 43 } 44 } 45 46 public class Orders 47 { 48 public double OrderTotal { get 49 ; private set; } 50 } 51 }
总结:封装之后提供接口使得调用方与被调用方分离的更加明确,集合的改变使得调用方不会去操作被调用方内部集合,只能调用接口。