【发布时间】:2012-09-21 11:08:09
【问题描述】:
NSMutableString 继承自 NSString,但是
继承是一种“是”关系。所以猫“是”动物。但是
NSMutableString“不是”NSString。 (因为NSString不能变异(不能改变))通常,子类能做什么,那么基类应该能做什么。比如鱼会游泳,有些动物会游泳。但是
NSMutableString可以改变,而NSString根本不能改变 - 没有任何NSString可以改变。
那么为什么NSMutableString 继承自NSString?此外,NSMutableArray 继承自 NSArray。 NSString 不应该继承自 NSMutableArray instead,而是将“不更改标志”设置为 YES 吗?这背后的原理是什么?
更新: 一些答案会说:NSMutableString 可以做所有NSString 可以做的事情,因此NSMutableString 继承自NSString。但是这个原理能用吗?石头可以静止不动。猫可以静止不动,也可以移动。猫可以做石头能做的所有事情,但我们不能让猫继承石头,对吧?
如果我有两个游戏对象类:一个是弹性对象,一个是非弹性对象,我认为将弹性对象实现为基类是有意义的,并且非弹性对象从它继承并带有标志外界不能改变。
【问题讨论】:
-
#1:猫是一种动物,但不是所有的动物都是猫,对于#2,子类不仅改进或重新定义基类的现有行为,而且最有用的是扩展基类提供附加功能的类。
-
其实你只是在兜圈子?你也可以说,一切都是由基本的夸克、胶子、电子和著名的高胸组成的。这些知识是否会导致您假设这些是编程中应该存在的唯一对象?一只死猫的化石可能躺在一颗行星上,它的太阳变成了超新星,所以这只猫被粉碎并吹向宇宙,在那里它的原子可能成为新恒星或其他星际物体的一部分。猫是哺乳动物是动物,这是一个重要的知识吗?
-
我投票决定将此作为题外话结束。看起来 OP 想要讨论他认为什么是可变/不可变对象的正确继承图。这里不适合这种讨论。
-
回答你问题的一切都已经说了。另外,你会被提示 Liskov Substitution Principle、duck typing 和 obj-c 协议。我认为没有必要进一步讨论。
-
@vikingosegundo 这些也是很好的解决方案。我认为我们都试图理解的一点是继承不是一些空洞的概念,而是需要与它所应用的问题域有某种关系。比我聪明的人花了很多时间思考这些事情。
标签: objective-c ios cocoa-touch oop