好问题。
在我看来,OO 是应用程序开发的关键点。许多应用程序开发人员根本没有太多的OO经验,这导致在SO上出现很多误解,烦躁,奇怪的问题和答案。首先是对Cocoas框架的基本架构以及如何使用它们缺乏了解,因为它们在很多方面都遵循继承和对象组合的思想,并利用了OO模式。这种缺乏会导致与框架的广泛斗争和/或(当学习第一个 OO 课程时)关于 OO 概念的完全过度设计。
对于您的问题:您似乎已经对基本的 OO 原则有了足够的了解,可以了解框架内部发生了什么。现在您应该注意保持简单。你的益智游戏听起来像一个典型的应用程序:你一个人或几个人一起工作,整个代码库会很小,它不是一个库,它的生命周期会很短,一旦完成,你将修复错误并拥有小改进,但不适应完整的新环境等等。所以我认为你不应该对问题中描述的问题大量使用 OO 模式(即使我猜所描述的解决方案会起作用)。
我会做这样的事情:
让你的puzzel的视图控制器通过实现所有需要的东西来完成所有的事件处理,比如:
touchesBegan
, touchesMoved
, touchesEnded
,accelerometer:didAccelerate:
给这个控制器一个模式并按下按钮打开它:
int controlMode; // in PuzzleController.h
在事件处理中打开控制模式,如下所示:
例子
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
switch (controlMode)
{
case ControlModeDrag:
touchedPiece = [self findPiece:event];
case ControlModeGravity:
//do nothing;
case ControlModeSomethingElse:
// whatever
default: //...
}
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
switch (controlMode)
{
case ControlModeDrag:
[self moveTouchedPiece:event];
case ControlModeGravity:
//do nothing;
case ControlModeSomethingElse:
// whatever
default: //...
}
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
switch (controlMode)
{
case ControlModeDrag:
touchedPiece = nil;
case ControlModeGravity:
touchedPiece = [self findPiece:event];
case ControlModeSomethingElse:
// whatever
default: //...
}
}
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
switch (controlMode)
{
case ControlModeDrag:
//do nothing
case ControlModeGravity:
[self moveTouchedPiece:accelaration];
case ControlModeSomethingElse:
// whatever
default: //...
}
}