Mac*_*Mac 8 c++ design-patterns objective-c mutability
最近我为iPhone做了一些开发,我注意到iPhone SDK中有很多有趣的设计模式,关于对象的可变性.
似乎典型的方法是定义一个不可变类NSFoo,然后从中派生出一个可变的后代NSMutableFoo.通常,NSFoo该类定义数据成员,getter和只读操作,以及派生NSMutableFoo者和变异操作的派生添加.
更熟悉C++,我不禁注意到这似乎与我在C++中编写相同代码时所做的完全相反.虽然你当然可以采用这种方法,但在我看来,更简洁的方法是创建单个Foo类,将getter和只读操作标记为const函数,并在同一个类中实现可变操作和setter.这样,你会最终有一个可变类,但类型Foo const*,Foo const&等等都是有效的不可变的相当的.
我想我的问题是,我对这种情况的看法是否有意义?我理解为什么Objective-C以不同的方式做事,但是我错过了C++中的两类方法有什么优势吗?还是我完全忽略了这一点?
这不是一个过于严肃的问题 - 更多的是出于我自己的好奇心而不是其他任何问题.
Objective-C 太动态了。在 C++ 中,const 限定在编译时强制执行,运行时任何违反 const 限定的行为(例如通过非 const 限定指针修改 const 限定对象)都是未定义行为。
这与 Objective-C 中没有私有方法的原因部分相同。您可以自由地向任何对象发送任何消息。运行时调度采用一个对象和一条消息,并解析要调用的方法实现。
如果const合格的对象只能调用const合格的方法,它将完全破坏 Objective-C 和 Foundation 的动态特性,因为这样的检查需要在运行时完成(第一个检查将确定发送的消息是否解析为 const 合格的实现)对于该特定实例,并进行另一项检查以确定该实例本身是否具有 const 限定)。考虑这个理论例子:
NSArray *mutableArray = [[NSArray alloc] init];
NSString *mutableString = @"I am a mutable string";
const NSString *immutableString = @"I am immutable because I am const-qual'd";
[mutableArray addObject:mutableString];
[mutableArray addObject:immutableString]; // what happens?!
// and what happens here (both immutable and mutable strings would respond
// to the same selectors because they are the same class):
[mutableArray makeObjectsPerformSelector:@selector(aMutableOperation)];
Run Code Online (Sandbox Code Playgroud)
突然你失去了动力。就像现在一样,可变和不可变对象可以一起位于不可变或可变集合中。
拥有可变子类可以保持 Objective-C 的动态特性并保持运行时的简单性。不久前有一个关于私有方法的类似主题。
| 归档时间: |
|
| 查看次数: |
1411 次 |
| 最近记录: |