继承是什么和应该是什么

fixopen 2006-07-18 03:17:49
fixopen() 09:32:22
继承,类不变性之间的关系是不是很亲密?
继承仅仅表达为增加特有的属性是不是不够完善?是不是还要有对已有的属性进行限制的能力才完善?类不变性可以非常自然的为heir增加parent原有属性的限制。
考虑多边形与矩形的继承关系。矩形就是边数为4,相邻边正交的多边形。可惜的是,如果没有对多边形原有属性的限制,很难表达这种继承关系,也导致了很少有人这样使用继承,非常自然和直观的继承。
狐狸发 () 09:37:22
有的时候最好不要用继承来描述普遍-特例这样的关系
一棵大白菜() 09:38:12
why?这是抽象性的表达方法
狐狸发 () 09:38:15
一般这种情况都是人为的经验性的行为,并不符合事物演化的规律
fixopen() 09:38:18
为什么?继承不就是用来描述这样的关系的么?
狐狸发 () 09:39:07
你说三角形和等边三角形有什么继承的关系么,还是人为的这样认为?
fixopen() 09:39:05
是因为现有语言大多数都不支持类不变性导致我们不能这样自然的描述吧。
fixopen() 09:39:28
等边三角形自然是三角形的heir。你不觉得?
一棵大白菜() 09:39:32
比如:大家来吃饭啦-〉fixopen,狐狸,无限....来吃饭啦
狐狸发 () 09:40:35
等边三角形只是3条都相等,只是属性上有区别,他就是三角形
一棵大白菜() 09:40:52
三角形具有等边三角形等其它特异三角形的通性
fixopen() 09:41:03
是啊,所以等边三角形继承自三角形非常自然和直观啊。
狐狸发 () 09:41:27
这时候不应该用继承来描述
fixopen() 09:41:28
可惜的是,我们的大多数OO语言都不能自然的表达这种关系。
fixopen() 09:41:42
你认为应该用什么来描述?
fixopen() 09:42:01
或者说,你认为继承的作用是什么?继承是用来干什么的?
狐狸发 () 09:42:19
子类应该拥有比父类更特殊的属性,普通三角形也有机会3条边都相等
一棵大白菜() 09:42:47
继承这个词可能会引起歧义,继承跟现实生活中的这个词含义是不同的
一棵大白菜() 09:43:03
代表泛化的反向
bighammer() 09:43:18
狐狸说的也很有道理:普通三角形也有机会3条边都相等 ,不过某个基类的作为一种派生类存在也是很正常的
fixopen(19710496) 09:43:22
按照你的说法,Window也可能有就是Button的机会,所以,Window派生出Button是不对的?
狐狸发 () 09:43:41
button有windows所没有的特性
fixopen() 09:43:46
有么?
一棵大白菜() 09:44:03
普通三角形也有机会3条边都相等那就是等边三角形啦,既是等边三角形,又是三角形
狐狸发 () 09:44:07
可以按,并触发一个事件
bighammer() 09:44:18
呵呵,可能我表达的有点不清楚,就是说普通三角形可以是等边三角形这一事实与OO里的继承不违背
fixopen() 09:44:25
一棵大白菜() 09:42:47
继承这个词可能会引起歧义,继承跟现实生活中的这个词含义是不同的
一棵大白菜() 09:43:03
代表泛化的反向

我也是这样认为的呀,继承就是特化嘛。

fixopen() 09:44:45
狐狸发 () 09:44:07
可以按,并触发一个事件

Window照样可以按,并触发一个事件。
狐狸发 () 09:45:18
我不这么觉得,我觉得等边三角形就是三角形并加上一个约束
一棵大白菜() 09:45:33
button是老婆奶头的父类
狐狸发 () 09:46:37
泛化和特例不光有继承的手法
还可以用分类的手法
fixopen() 09:46:48
现在你们就是不承认我们现在常用的OO语言有缺陷?



狐狸发 () 09:45:18
我不这么觉得,我觉得等边三角形就是三角形并加上一个约束



这句话说得太多了,事件所有的继承都是如此。

人是哺乳动物加上一些约束定义的。Button是Window加上一些约束定义的。

fixopen() 09:47:03
太多了-->太对了。
狐狸发 () 09:47:16
普通window不能成为一个button
狐狸发 () 09:47:32
button拥有普通window不具备的特性
fixopen() 09:47:34
在我看来,继承就是分类。
fixopen() 09:47:50
普通哺乳动物也不能成为一个人。
狐狸发 () 09:47:56
那你就这样认为好了
fixopen() 09:48:19
人也拥有普通哺乳动物不具备的特征。
狐狸发 () 09:48:52
人并来就是哺乳动物的子类
++oeqe() 09:49:08
button也室window的子类啊。。
狐狸发 () 09:49:38
这我也承认啊
狐狸发 () 09:49:51
我没说button不是window的子类吧
狐狸发 () 09:50:16
但是一个4边相等的window是window的子类吗
++oeqe() 09:50:36
这个属于数学集合论的范畴
bighammer() 09:50:43
这跟矩形与多边形得例子有什么区别
一棵大白菜() 09:50:52
你说为什么不是?
狐狸发 () 09:51:14
因为没人定义4边相等的window是一个特例,所以你没感觉吧
fixopen() 09:51:38
我怎么不知道你在说什么呢?
fixopen() 09:51:52
Window有四边不相等的么?
一棵大白菜() 09:51:57
没人用当然就没人定义
狐狸发 () 09:51:59
这和等边三角形一样,如果没人把等边三角形定义为一个特例,你也不会有继承的关系吧
狐狸发 () 09:52:13
你也不会觉得有继承的关系吧
fixopen() 09:52:38
关键是,你用继承表达什么?
狐狸发 () 09:52:45
这只是经验行为,而不是演化
fixopen() 09:52:52
是不是表达一个集合的特定子集?
fixopen() 09:53:07
继承用来表达演化?
狐狸发 () 09:53:23
继承就是演化啊
fixopen() 09:53:23
这是你说的呢,还是公认的?
一棵大白菜() 09:53:33
代表特化,跟模板本质一样
狐狸发 () 09:53:46
基类->派生类
这就是一种进化
一棵大白菜(301464) 09:53:33
代表特化,跟模板本质一样
狐狸发 (99643412) 09:53:46
基类->派生类
这就是一种进化
狐狸发 () 09:54:23
如果你认为是一种子集,那么未知的子类怎么考虑呢
狐狸发 () 09:54:37
他现在根本不在集合里
fixopen() 09:54:39
那么,你觉得人是哺乳动物概念的演化么?
狐狸发 () 09:55:02
当然是
狐狸发 () 09:55:30
应该说人是某种哺乳动物进化而来
狐狸发 () 09:55:56
应该说人是某种哺乳动物进化而来
所以人继承了哺乳动物的特性
fixopen() 09:55:59
莫非我们对哺乳动物研究的越深入,我们对哺乳动物的概念越清晰,结果,哺乳动物就是人?
狐狸发 () 09:56:37
看来你对演化的词理解有问题
狐狸发 () 09:57:00
人可以是哺乳动物,但哺乳动物不一定是人
fixopen() 09:57:28
stop,我看到你又在引入一个概念叫作进化,继承是表达进化还是演化。
或者,你说得演化就是进化?
我还以为你说得演化是我们对概念感觉的变化呢。看来你想表达的是进化:)
一棵大白菜() 09:57:35
就是建模的详细程度,不管你认识是否足够
狐狸发 () 09:58:04
好吧,我们就把这个词确定为进化
炮炮() 09:58:30
Evolution Complete!
fixopen() 09:58:37
我同意大白菜。
不同意狐狸发。
我认为狐狸发在某种程度上属于偷换概念。
一棵大白菜() 09:59:25
关键是:分歧在哪里?我都没搞明白
fixopen() 09:59:24
如果是进化的话,你认为形状可以进化为三角形?
fixopen() 10:00:12
我们对形状建模的越详细,它就越是三角形?
狐狸发 () 10:00:28
我说了,有些概念用继承来描述并不好

而不是所有的东西都用继承来描述
一棵大白菜() 10:01:03
我们对形状建模的越详细,越能代表多的特例三角形类别
狐狸发 () 10:01:06
象模板特化就不是继承关系
fixopen() 10:01:13
我知道用现在的OO语言的继承来描述不好,可我说得是:我认为现在的OO语言有缺陷。
狐狸发 () 10:01:28
这更偏向与分类
一棵大白菜() 10:01:28
用词不同而已
fixopen() 10:02:13
麻烦你仔细看看我的初始描述。
fixopen() 10:02:45
继承,类不变性之间的关系是不是很亲密?
继承仅仅表达为增加特有的属性是不是不够完善?是不是还要有对已有的属性进行限制的能力才完善?类不变性可以非常自然的为heir增加parent原有属性的限制。
考虑多边形与矩形的继承关系。矩形就是边数为4,相邻边正交的多边形。可惜的是,如果没有对多边形原有属性的限制,很难表达这种继承关系,也导致了很少有人这样使用继承,非常自然和直观的继承。
狐狸发 () 10:02:53
麻烦你看看我最早的回复
fixopen() 10:03:23
我知道你的回复,你说最好不要,我认为用继承是自然的,而你认为不是。这就是分歧。
一棵大白菜() 10:03:43
对已有的属性进行限制?有此功能啊
狐狸发 () 10:04:20
我的观点是,有些概念并不是自然的,是人为经验化的,这样用继承去描述就很牵强
一棵大白菜() 10:04:24
子类可修改继承自父类的行为
一棵大白菜() 10:04:35
就是变异
...全文
2142 71 打赏 收藏 转发到动态 举报
写回复
用AI写文章
71 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiazaiguo 2007-03-05
  • 打赏
  • 举报
回复
...
shan_ghost 2007-01-31
  • 打赏
  • 举报
回复
矩形是四边形.因此矩形应当有四条边,我们应当可以一一设置四边的边长.

同样,正方形也有四条边,我们应当可以设置四边的边长.

此外,我们还必须有夹角以及所在平面的知识,否则就不可能知道四边形是不是空间四边形...

追根溯源起来,我们岂非必须在正方形中写本解析几何进去呢?

传说中的过度设计~~~~~~
shan_ghost 2007-01-31
  • 打赏
  • 举报
回复
我们说正方形是长和宽相等的长方形;我们又说正方形各边相等,不存在长和宽的区分:这种说法在根本上就是自相矛盾的。

但我们不是婴幼儿,所以我们知道,第一种说法的含义和应用场合不同于第二种说法:
当我们给别人讲解数学知识时,我们必须用第一种说法;但当我们告诉木匠我们需要多大尺寸的一张方桌时,我们就必须用第二种说法。

请问,你是否准备为自己的长方形和正方形类设计一个“选择场景”接口?如果没有这个接口,你怎么处理这个说法的二义性?



从根本上说,就是我们口语的is-a是一种很泛化、因场合不同而有不同解释的说法。

除非是将来人工智能有重大突破的时候。这种不精确,不应、也没有办法引入我们的编程领域。


如果真的做过翻译的话,就会知道这个常识:很多时候,不同语种之间,确实是根本无法交流的。你唯一能做的,就是尽量用替代的说法、尽可能地去逼近原文的含义。

自然语言间尚且如此,何况是刻板的程序语言?

因此说:不管喜欢不喜欢,请尊重OO领域is-a的语义——并请注意:OO是为了解决代码复用问题、简化程序总体设计(而不是为了“让你能用自然语言写程序”)而诞生的。
is-a只是帮助你理解OO概念的近似译法;实现和自然语言等同的is-a,不是OO的目标,更不是OO的责任。
shan_ghost 2007-01-30
  • 打赏
  • 举报
回复
我认为,这个问题是两个原因造成的。

1、我们的自然语言是模糊的,二义的,并且是上下文相关的,甚至可能是基于大量常识的;而程序语言是精确并且上下文无关的。这就造成转换的麻烦。

这个问题不是本质问题。作为好的设计师,把模糊的东西清晰表达出来,这是基本要求。

2、目前的OO语言,它的语义是比较“紧窄”的。比如它认为,作为一个概念(基类)的某个特例(派生类),那么派生类就必须能做到基类能做的一切。

注意:在这上面绝对不允许有任何妥协。否则代码复用就必然成为空谈。OO带来的一切好处都必将荡然无存。这是OO的设计目的所决定的。


结论就是:OO领域的is-a,有它自己的含义。它并不必然、也不需要和客观世界的is-a完全对应。
正如汉语没有英语的profession一词的对应物、英文也说不清楚不出我们“道可道,非常道”首尾两个“道”的意思、世界任何语言都没有办法翻译爱斯基摩人的几十种关于白的形容词那样。


有了这点认识,那么关于正方形是不是矩形的问题就很好讨论了。

答案就是:视你要解决的实际问题,选择最合适的表达方式。



绝大多数情况下,可以认为正方形就是矩形的一种,并且不会带来任何问题。

但,如果你要拿这个问题对付你的学生,让他意识到程序设计领域里,有些东西是反常识的,那么这是个好例子。


另外,我们从小就知道,长方形需要两个参数就可以确定:长和宽。并且,长方形的长边才叫长,而短边叫做宽(或者,横边叫做宽)。

那么,请统计下,你见到的程序窗口中,有几个是height>width的?
如果你写了个实时3D程序,难道方头方脑的角色侧空翻一周,你还必须实时计算每个矩形格的朝向,随时倒换它们的长/宽表示不成?
tonyt 2007-01-30
  • 打赏
  • 举报
回复
mark
39457760 2006-12-06
  • 打赏
  • 举报
回复
mark
lifeNet 2006-10-11
  • 打赏
  • 举报
回复
本来已经无话可说了,可是还是忍不住想说。
我这个帖子的目的是讨论OO中的继承,不是讨论各种语言特性,有人提出来UML的语言无关性什么的,我觉得很奇怪,因为,UML本身就是一种语言。用于OOA和OOD方面的语言。

什么时候我们能够敞开胸怀仔细认真的考虑OO本身而不是各种描述OO的语言边界及限制呢?

晨星上面说道:OO中的继承(is-a)跟别的领域的isa是不相同的,因为,别的领域的isa是只关注特性,不关注行为的。这算是一个有力反驳。但是,我仍然不能认同。原因很简单,其实行为也是特性。

有的时候,似乎field和method是泾渭分明的两种东西,其实这是smalltalk给出的恶果。真正的区别不应该是field和method,而是query和command,查询对象状态和修改对象状态。谁会觉得o.m跟o.get_m()有本质的区别?谁会觉得o.set_m(newM)跟o.m = newM有本质的区别?一个对象应该表达一个现实的抽象,而一个类描述了一个对象的模版。类描述的是所有该类对象必须遵守的法则,叫做不变性。

类的继承继承是什么?

继承(我这儿专指OO中的接口继承,实现继承不予考虑,我宁愿把那玩意叫做mixin)就是isa类型的对象模版重用。继承的限制就是LSP,这是OO扩展性的核心所在。继承必须满足不变性不断增强这个特点,否则,没有办法满足LSP。

为什么这么说呢?还得从类的本性——不变性说起。不变性其实规定了对象的特征边界,如果一个子类竟然不像父类那样遵守相同的不变性,我们怎么能说:在任何是用父类的地方都可以用子类代替?如果不能这样,那么LSP岂不成了空谈?
fixopen 2006-10-11
  • 打赏
  • 举报
回复
上面还有一个问题没有讲清楚,
对于Query,我们都认为没什么好说的,子类定然服从父类的不变性,甚至可以加强。但是对于Command,很多人就有点含糊了,觉得是不是我们对于对象的操纵,子类的对象可以比父类的对象多出来更多的花样呢?自然是可以的,可问题是:这个花样指定在父类的不变性约束之下。它不可能超越于这个不变性,只能是加强而不能是减弱。
crazy_liu 2006-10-10
  • 打赏
  • 举报
回复
太 !!!!!!!!!
sjjf 2006-10-09
  • 打赏
  • 举报
回复
我们讨论的是很实际的人做设计的问题,不是计算机自动作设计的ai问题。关于ai这个问题太深奥了,我讨论不起,我也并不打算让计算机理解些什么,只是遵循它的计算规则,构造我的计算过程,输入信息,得到我的计算的结果罢了。

但是我坚持,只要信息足够,人就能够作出正确的判断和推理。
世界上没有完全相同的东西,你在一个点上判断不出来,那你可以扩大判断的范围。
总会判断得出来的, 就像发烧,表面看起来就是体温升高而已,如果你单纯的靠量体温来判断肯定判断不出来病因,但通过验血啊,等等诊断手段,
还是可以确定到底是由于被病毒入侵还是病变引起的。
至于是否真的是确诊和医生个人水平和她所得到的信息有关。
对于判断不出来的病因,医生的解释一般也是现在的手段不太发达,检验不出来,
而不是医生的认知存在混乱,而这种解释也能被我们接受。

关于庄鱼提出的那个小问题,我个人认为没有什么意义。信息太少了,作出的判断必然也是不完全的。一个完整的系统孤立出来某部分意义不大。






mu_yang 2006-10-09
  • 打赏
  • 举报
回复
继承的目的是什么
我认为应该是更重要的问题
庄鱼 2006-09-30
  • 打赏
  • 举报
回复
想象很美!可实际上却并不如此,因为我们自己在认知的时候都不能保证自己见到的就是真实的,距那个镜子屋也是同样的道理,因为你通常并不知道你透过眼前这块玻璃看到的是对面镜子折射的图像还是对面玻璃透过的实体,尤其是这样反反复复几层之后。以为能直接分辨镜子与玻璃的差异,找出真相那已不是天才而是神的能力了。
我们人对万物的理解极为可怜,信息爆炸之说早就把我们烧糊涂了,就连我们身上得很小一个问题都还搞不清楚,又如何定义清楚让计算机知道的事,充其量也只是让计算机了解一个大概罢了。既如此,我们又如何信誓旦旦的说计算机描述不是抽象的、非片面的概念呢。
同样的再提一个小问题:前一天吃的菜跟今明两天见的人、做的事有什么关系。虽然肯定是有关的而且还是决定性的,但还真的很少有人能说出来!
庄鱼 2006-09-28
  • 打赏
  • 举报
回复
一个很简单的例子:在一个玻璃与镜子搭建的玻璃屋里,你怎么知道你面前的是镜子里的对方影像还是透过玻璃的真实的人。
sjjf(水晶剑锋)的最大问题在于将人意识中的概念对象与计算机的对象概念混淆了,然而这两者看似相同确有很大的本质区别:人的认知概念是纯抽象大跨度描述,而计算机的对象概念的牵涉到实现的精确描述,是小跨度描述。用计算机解决自然现象需要大量的分类定义,而人的认知却可以很简约概括。
sjjf 2006-09-28
  • 打赏
  • 举报
回复
我不认为我的认知存在问题。
如果我知道有一面镜子在我面前,无论镜子里面的东西多逼真,
我也不会认为它是一个和我一样的实体。当然,它可以是另外一个叫虚拟影象的实体,
如果我知道有一面玻璃在我面前,那么我就可以认为它是和我一样类型的实体。

当然,你们也可以说万物皆幻象,物理学上,人眼看到的东西都是由光组合的。
假如能够模拟这些进入眼里的光,那么就可以产生影象,但是这个影象是什么实体,
还需要别的信息才能判断而不是影象的本身,很多时候那些别的信息才是判断的关键,
比如我看电影的时候,从来不认为电影中的是完全真实的人(实体)在我看的时候在动,
尽管它很逼真,因为我知道我在看电影,计算机里也一样,什么是一个实例,
什么是一个实例存储在数据库里的数据,虽然他们数据可能完全一样我都能分辨的很清楚,
因为这些是我指定的,或者现有计算机系统指定的,在目前,计算机并没有智能,它只是我们思维的延伸。

我不打算说服你们了。已经上升到哲学高度了,不想讨论庄周梦蝶之类了。
qingcairousi 2006-09-22
  • 打赏
  • 举报
回复
为什么我们知道美女和海报是不同的?因为我们获得了大量的,足够多的信息。想象一下,从个小洞中偷窥,一个美女的影象一闪而过,这个时候,恐怕就没有那么容易判断这个美女究竟是真人还是海报了吧?
我们能够区分物体的不同,是因为我们在当前环境下获得了足够多的信息。当信息不足的时候,谁都无法判断。
我们当然知道记录和汽车的不同,那是因为在日常环境中,我们已经积累了足够多的经验。想象一下,一个原始人会把电视机里面的人不当真人么?
可是计算机的环境不是我们日常的环境,对于计算机来说,记录和车子这两个“黑箱”所提供的信息非常有限,就是颜色和尺寸,根据LSP原则,是等同的。但是在我们看来,这两个玩意不是黑箱,至少不是没有分类的黑箱。于是矛盾就出现了,计算机能够视为同类的东西,在我们的经验上,是不同的。于是必须用一个新的分类来表达计算机的这种分类方式,这就非常别扭了。
qingcairousi 2006-09-22
  • 打赏
  • 举报
回复
关于载体和本体,可以这么问:你怎么知道你不是在黑客帝国里面?
qingcairousi 2006-09-22
  • 打赏
  • 举报
回复
因为根据LSP原则,这两个玩意就是同一类。
现在的问题是,在没有得到足够的信息的时候,你怎么知道你面对的,究竟是载体还是本体?而是载体和本体,又有什么区别么?如果都能够满足你的需要的话。
我们的视角和计算机的视角是不同的,所以我们有足够的信息区分本体和载体,但是计算机没有。因为我们需要用计算机来解决问题,因此我们必须从计算机的视角来看问题,当我们面对这样的玩意,就要告诉自己,这两个玩意是同类。但是这个结论又和我们的日常经验相悖,这就是矛盾的根源。
可以把“计算机”替换成“另一个人”,就明确了。oo继承的局限性就是这个,随着视角的不同,继承内容的变化是很大的,大到我们的日常经验难以接受的地步。

所有的讨论都会离题:)
ModoRang 2006-09-22
  • 打赏
  • 举报
回复
强帖
sjjf 2006-09-22
  • 打赏
  • 举报
回复
绕着绕着,又跑到计算机识别上去了,好像离题了 :)

原始人把电视机里面的人当真人没有什么错误,但是他是绝对不会把电视机当人的。
一个载体携带的信息不等同与载体本身,即使你根据上面的信息在脑海里
还原出本体,但还是不一样的,所以我无法理解为什么你总是在强调
记录和车子能够被视为同类的东西。
qingcairousi 2006-09-21
  • 打赏
  • 举报
回复
=================
那么概念又是什么呢?
=================
概念是对特性的主观描述。


====================================
父类就是同一划分标准下的子类们的交集。
====================================

这个是我表达错误。准确的说,是在表达交集的时候会有很大的局限性。尤其是属于不同类型体系的两个object的交集。
比如说,车子有尺寸和颜色,数据库里面一条记录也有车子的尺寸和颜色。那么记录和车子的交集就是尺寸和颜色。但是如果以继承表达这个交集,概念上就是车子和数据库的记录同属一个父类,这个父类有尺寸和颜色。这样的结论显得很不自然。
但是使用不同的类型体系是不可避免的,因此,不同类型体系中的object的交集也很难避免。
加载更多回复(51)

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧