C#学习笔记:理解规范接口的赋值运算
最近在学习C#,现在看的书是台湾黄聪明先生编著的《C#面向对象的程序设计》(科学出版社出版),与以往读的Wrox系列或者其他国外计算机教程不同,这本书里没有任何地方提供了与作者联系或者反馈的途径,也没有提供此书的在线交流网址或者新闻组。
在书中第8章《类与面向对象程序设计》第8.3.4节讲规范接口(interface)的赋值运算时,作者设计了这样一个练习题:“将实现interface的对象赋给该interface的引用是可以的,那么请问:这样的赋值运算在直觉上是否合理?”
作者的解答如下:“以逻辑学的推论来看,这个赋值运算是合理的,就好像说:所有的女人都是人,郑雅文是女人,所以郑雅文是人;故:所有的USB鼠标都是符合USB规范的,罗技生产的的鼠标是USB鼠标,所以罗技生产的USB鼠标是符合USB规范的”。
看完作者的第一个逻辑推理例子之后,我觉得我已经懂了:所有实现一个interface的对象,都必须实现这个interface规定的特征,将其中某个对象A赋给一个引用该interface的对象B时,只有在该interface中定义的成员才会被赋值给对象B,而对象A中独有的成员则不会被赋值给对象B。
但是继续看作者推理的后半部分的时候,我却感觉怪怪的,总觉得别扭。仔细把两个实例好好比较一下,发现后半个例子的逻辑推理有问题。如下:
- 所有的A都是B;
- C是A;
- 所以C是B;
例子一:
- 所有的女人(A)都是人(B);—-女人是人的子类,不管女人是不是规范,都必然是人;
- 郑雅文(C)是女人(A);
- 所以郑雅文(C)是人(B);
例子二:
- 所有的USB鼠标(A)都是符合USB规范的(B);USB鼠标是“符合USB规范的”的子类?次品??
- 罗技生产的鼠标(C)是USB鼠标(A); 罗技只生产USB鼠标?不生产PS/2的??
- 所以罗技生产的USB鼠标(C??)是符合USB规范的(B);
作者的第二个例子本身存在的逻辑推理是不是正确先不提(参考斜体部分),只说在其结论句中的C和第二个条件句中的C已经在范畴上发生了变化,那他怎么还能套用这个公式呢?罗技生产的USB鼠标,和罗技生产的鼠标,其外沿已经发生了变化。如果把这个例子正确地还原成推理公式,就变成了:
- 所有的A都是B;
- C是A;
- 所以D是B。
这就难怪让人感觉别扭了,它根本就是错误的。
回到那个题目里来,我们假定B是一个规范接口(interface),A是一个符合B的对象,C是一个引用B的对象,则A中符合B的成员将赋值给C,作者想说明的应该是这样的关系。在这里,跟推理公式相比较,在公式中的A是B的子类或者叫子集,而在题目中的A却不是B的子集,因此作者所举的例子根本就不能用来解释这个关系。其实用直观的方法很容易就把关系说明了:
- B是一个规范接口,规定了两个成员x和y { B.成员x B.成员y }
- A是一个符合B的对象,规定了三个成员x,y和z(注意:x和y必须有) { A.成员x A.成员y A.成员z }
- C是一个引用B的对象,则C也有两个成员x和y { C.成员x C.成员y }
当我们把A赋值给C是发生了什么?结果如下:
C.成员x = A.成员x
C.成员y = A.成员y
而A.成员z不会被赋值为C.成员z,因为成员z不是规范接口B中规定的成员。

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名小李刀刀(包含链接)。如您有任何疑问或者授权方面的协商,请给我发送邮件。
本来是在学习PHP的,为了系统学习PHP5中的OOP。固也买了一本Wrox系列C#入门经典 学了起来,呵呵
[quote=Romenic]我已然晕了[/quote]
别看前面那个逻辑推理过程,只看后面关于C#接口赋值运算的部分好了,如果对C#中的接口、引用有概念的话,一看就明白了。如果不了解相关概念的话,光从我写的那个例子来理解可能不太容易……[smile]
我已然晕了