在OO的思想体系中,封装性是一个很有意义的概念,它让对象能够拥有的独立能力,这些能力应该是私有的与公有的并存。
C#中,提供了如下的修饰符来描述一个类:
public 关键字是类型和类型成员的访问修饰符。公共访问是允许的最高访问级别。对于访问公共成员没有限制。
internal 关键字是类型和类型成员的访问修饰符。内部成员只有在同一程序集中的文件内才是可访问的。
上述文字来自于MSDN,一般情况下,使用最频繁的应该是public与private,在不少设计模式的教程资料中,几乎都是只使用了public与private。
对于public,可以公开类或成员,给外部提供可访问的类或它的成员,在类与类之间的通信提供一个通道,很明显public是非常强大的。
但是,滥用public会带来很多麻烦的事情,比如一个动物系统(假设)中,有“鸟”这个类,同时还有“翅膀”这个类,很明显,翅膀是属于鸟的,在外部的访问中,提供显式的接口应该是访问“鸟”,而不应该访问“翅膀”,同时也不应该有能够访问翅膀的能力,这里的由于鸟与翅膀是两个类,鸟要能够访问翅膀这个类中的内容,那么就应该把“翅膀”这个类公开给“鸟”。如果直接使用了public,结果是,外部的类来访问时,它即可以看见“鸟”这个类,也可以看见“翅膀”这个类。
这说明外部类可以看见你本来想隐藏的“翅膀”。在这里,当然可以通过写一些附加的代码来限制外部的可访问类。可惜,这不是一个好主意,在真实世界之中,如果在没有必要的情况下,你知道这东西是鸟类就行了,至于它长得一个什么翅膀,可能并不需要关心。这里就需要一个好方法来限制外部类对这些类的可见度。
调整类的可见度,可以通过一开始提到的几个修饰符,上面的修改符,很明显没有提供什么比较有意义的访问控制。因为无论是用哪一种,都不太容易达到我们要求的效果。
要解决此问题,可以使用接口,“鸟”类继承于该接口,“翅膀”并不继承于接口,它在某命名空间中,提供为public,然后外部访问通过接口进行,这样,可见性就被适当地限制住了。
如下所示:
对于层次构造过深、过于混杂的类,可以考虑发布为程序集的方式,这样,在程序集内部中还可以通过internal 来限制访问的可见性,这样就大大地提高了灵活性,并有更多的组合方式可以选择。
善于使用命名空间进行分割类间的关系,是一个比较好的办法。在现在的OO思想中,分割的单位不应该再一个类,而应该是一组类构成的一个命名空间,在这个命名空间中,类间的相互作用是比较紧密的,耦合度也高,但通过以命名空间为单位来实现,可以实现包与包间的低耦合性,包内的高内聚性。