静态类、实例类、嵌套类、结构、简单的抽象类、简单的密封类
确实比较有趣。。这里 1.静态类,2.结构,3.密封类 这三者,都是 挥刀自宫,没有 OO特性的。——要了解OO特性,其实很简单,只需要打开设计模式的 PPT,看看那些类图。。设计模式中大量使用到了 OO特性。。反过来说,设计模式类图中用不到的 这些 构造块,其实,很可能就是没有 OO特性的。。
1.静态类:与静态有关的任何构造块,全部没有 OO特性。所谓静态,即为全局,之所以要全局,就是为了‘稳定’——而 OO特性,天生是为了 OCP 为了可扩展,面对变化——所以,静态static关键字 出现的地方,就失去OO特性。 单例模式中的static,其实只是为了让 类的使用者至少能有办法拿到该类的实例,并不是体现 OO特性。
2.结构:这确实是一个非常有意思的东西。因为在C++中,大量使用结构,而Java中完全摒弃 结构 。首先,结构是 值类型。C++中,绝大部分的类型都是 值类型。如果要让值类型获得 引用类型 的特征,需要‘取地址’操作,得到的地址之后操作地址,才有了面向对象的意义——GOF23种设计模式,首先是针对C++编写的,个人观点,对于老前辈,还是要给于一定的尊重。
反过来,Java作为对C++某种程度上的颠覆,除了8种基本类型(不是对象)外,所有的自定义类型都是 引用类型。Java,10几年来,变化确实比较小,这也是它最近被诟病不能与时俱进的一大杯具。但,把OO精神推向纵深的貌似要属它。因为学习曲线低,很容易入门。除了8种基本类型(这些类型不用学,基本上所有语言都用),只要你自定义了类型,它天生就是 引用类型。
再看看C#。。这位老兄的优势是,背靠大山,得天独厚。它既保留了C++复杂语法中,关于值类型(可以自定义的值类型,就是 Struct——ValueType。。枚举类型其实也是一种结构)的部分,又大量借鉴了Java的引用类型。如果使用C#,又需要写出 OO风格 的代码,当然,最好多使用 Class,而不是 Struct。Struct的用武之地,在于封装那些不太赋予变化的值,像枚举这样的封装,也有很大用处。
3.密封类。这个构造大概基本上会在 框架 中用到较多。我们自己写的类,如果不想被别人继承,那就把类标记成 Internal,别人也就看不到你这个类了。——当然,如果别人能拿到源码,或者反编译得到,那就是两码事了。。那你用sealed关键字,岂非也是不保险的。。人家可以改嘛。