-6

NSMutableString继承自NSString,但是

  1. 继承是一种“是”关系。所以猫“是”动物。但是一个NSMutableString“不是”一个NSString。(因为NSString不能变异(不能改变))

  2. 通常,子类能做什么,那么基类应该能做什么。比如鱼会游泳,有些动物会游泳。但是一个NSMutableString可以改变,而且NSString根本不能改变——没有NSString任何东西可以改变。

那么为什么NSMutableString继承自NSString?此外,NSMutableArray继承自NSArray. 不应该NSString继承自NSMutableArray instead,而是将“不更改标志”设置为 YES ?这背后的原理是什么?

更新:一些答案会说:NSMutableString可以做所有可以做的事情NSString,因此NSMutableString继承自NSString. 但是这个原理能用吗?石头可以静止不动。猫可以静止不动,也可以移动。猫可以做石头能做的所有事情,但我们不能让猫继承石头,对吧?

如果我有两个游戏对象类:一个是弹性对象,一个是非弹性对象,我认为将弹性对象实现为基类是有意义的,并且非弹性对象从它继承并带有表示外部边界的标志不能变。

4

5 回答 5

4

继承是一种“是”关系。所以猫“是”动物。但是 NSMutableString “不是” NSString

错误的。NSMutableString一个 NSString,因为它可以做任何 NSString 可以做的事情。

通常,子类做什么,那么基类应该能够做什么

也错了。这是相反的方式。而是“基类可以做什么,子类也必须可以做”。

NSString 不应该从 NSMutableArray 继承吗?

我什至看不到两者之间的关系(只要wchar_t不是有效的 Objective-C 对象)。

总而言之:原因是 NSMutableString 比 NSString 能做更多的事情,并且可以做任何 NSString 能做的事情,因此继承的方向。

于 2012-09-21T11:19:57.167 回答
1

可变版本为不可变版本添加了额外的功能,这就是它们从另一个版本继承的原因。

但是您缺少的另一个原因是具有可变/不可变版本的类实际上是隐藏了很多实现的类集群的成员。因此,您所认为的简单类继承远不止于此。

继承还允许应用Liskov 替换原则的便捷方法

于 2012-09-21T11:11:57.403 回答
1

子类<->类关系通常被称为“is-a”关系。但实际上我认为 Javaextends更好地描述了它:子类扩展了它的基类的功能。

NSString 对象知道保存字符串和编码的所有内容。
NSMutableString 对象知道所有这些,但还知道如何更改存储的字符串,因此说“NSMutableString extends NSString”非常有意义

来自一条评论:

基类应该更广泛和通用。一个动物更加宽泛和笼统,就像可变字符串更加宽泛和笼统一样。不可变的字符串更“特殊”。所以这就是为什么以这种方式看待它的原因,基本情况应该是可变的情况是有道理的

NSString 更通用,因为它让您有机会创建它的另一个子类,可以添加更改功能,而无需使用 NSMutableString 的实现,为什么您会想要这样做。如果将功能放置在 NSString 本身中,您将只添加第二次,并且您的对象将携带代码,这是重复的,这将导致代码膨胀。还有很多情况下,您的字符串永远不会改变,即按钮上的标签。如果将其实例化为可变对象以及所有用于突变的代码,那将是浪费资源。

如果我有两个游戏对象类:一个是弹性对象,一个是非弹性对象,我认为将弹性对象实现为基类是有意义的,并且非弹性对象从它继承并带有表示外部边界的标志不能变。

不,那将是一个弱设计,因为非弹性对象将携带所有用于执行弹性行为的代码。

于 2012-09-21T11:54:48.983 回答
0

我认为继承意味着其原始类的扩大和多样性,尤其是功能。哺乳动物通常是陆生动物,但海豚可能生活在海中。可以说,海豚是从哺乳动物那里继承下来的,在海里生活的功能扩大了。

于 2012-09-21T11:18:04.477 回答
0

说继承作为“是”关系起作用是正确的,但完全是误导性的。英文中的“is a”意味着“to be”的完整含义。在继承的情况下,“is a”仅暗示子类型关系(最好对类进行编码,以便满足更强的 Liskov 替换原则要求)。

一个更好的英语术语(仍然不完美,但更好)是“X 做了 Y 所做的一切”。更好的是,在典型的 OO 术语中,这意味着“X 拥有 Y 拥有的所有成员”。

ANSMutable*确实是 an 的子类型,NS*而不是相反,因为 an 的任何(本质上非变异)消息和属性NS*也适用于,NSMutable*而后者的任何变异消息或可变属性都不适用于前者。

通常,子类能做什么,那么基类应该能做什么。是不正确的。事实上,情况恰恰相反。基类能做什么,派生类也应该能做什么。

至于字符串和数组,在 Objective-C 中,数组和字符串有非常不同的方法集。只需检查类文档。因此,它们在继承层次结构中完全分离(当然,除了 common NSObject)。

关于石头和猫的例子,石头的唯一特征是它静止不动,猫的唯一特征是它静止不动或可以移动,对于这些属性的适当定义,拥有一个非常有意义猫继承了一块石头。

于 2012-09-21T11:21:41.960 回答