第五章:继承和多态
基本没什么新东西,这部分感觉更像Java多一些。大概有这么几点(不是重要的,只不过是我想说的):
1.覆盖父类虚函数时要用override显式指定。这样做的确让代码变得更清晰了,因为c++中子类的virtual不是强制的。作者说这样做还可以防止以后如果父类和子类同时各自加入某个虚函数而产生的混乱。比如有父类Box和子类advanceBox,代码由两个人维护。有一天,他们都突然想在自己的类里面加上一个虚函数sort()。在C++里因为都是用virtual来指定,显然子类中的sort()就成了父类的多态,而这并不是程序员的初衷。C#改用virtual+override配合可以发现这个问题,而且用new virtual可以强制屏蔽掉父类(这下叫什么态?恩,要是这样的程序可以算变态吧)。最好的方法就是祈祷不要让这种情况出现,不过似乎看起来很容易出现。
2.Abstract和Sealed。看起来是在向Java学习,看起来可以无视(Abstract用Interface来代替;Sealed嘛,暂时不知道什么时候改用它)。
3.一切源于Object类(其实,Java还是有很多好处的,尤其是在高级的层面)。(又:是不是toString()可以算是Java的一个标志呢?就像i++之于C++)
第六章:运算符重载
哈哈,没想到C#还保留了这个。不过书里也说的很清楚,其他的.NET语言并不支持这个。也就是说即时你重载了‘+’,那也得有个add()备用。
说个笑话:
C++程序员看待Java: 我靠!什么高级语言,连个‘==’都不能重载。
Java程序员看待C++: 都什么年代了,我们是文明人,要说equals()!
言归正传,我就想说一点: C#中重载必须是public static,所以二元运算符重载必须有两个形参(我早就看不惯那样用this了,嘿嘿)。这样在形式上看起来就比较清晰,也比较爽。