Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Obj-C中的最优类层次结构_Objective C_Cocos2d Iphone_Abstraction - Fatal编程技术网

Objective c Obj-C中的最优类层次结构

Objective c Obj-C中的最优类层次结构,objective-c,cocos2d-iphone,abstraction,Objective C,Cocos2d Iphone,Abstraction,在我的项目a游戏中,我有多个由触摸操作的对象,因此我认为将所有可触摸对象作为可触摸抽象类的子类将是一个好主意,大致如下: Touchable是CCSprite的一个子类 Box是Touchable的一个子类 马达是可触摸的一个子类 因此,Box和Motor是ccsprite,它们继承了可触摸的常用方法,并可以覆盖它们 这是一种正确的方法,还是有其他方法来处理这种层次结构?取决于Touchable是否表示每个类都必须显式实现以支持的随机行为集,或者是否可以有一个单独的实现,只与继承一起工作,并且可

在我的项目a游戏中,我有多个由触摸操作的对象,因此我认为将所有可触摸对象作为可触摸抽象类的子类将是一个好主意,大致如下:

Touchable是CCSprite的一个子类

Box是Touchable的一个子类

马达是可触摸的一个子类

因此,Box和Motor是ccsprite,它们继承了可触摸的常用方法,并可以覆盖它们


这是一种正确的方法,还是有其他方法来处理这种层次结构?

取决于Touchable是否表示每个类都必须显式实现以支持的随机行为集,或者是否可以有一个单独的实现,只与继承一起工作,并且可能有一点自定义

如果是前者,那么你的想法基本上是正确的。如果是后者,那么Jack关于使用@protocol的建议是有道理的,它非常像Java中的接口

就我个人而言,我会保持它非常简单。从一个SPAbstractSprite类开始,该类是CCSprite的子类。然后,将其子类化为SPBox和SPMotor

在SPBox和/或SPMotor中启动您的实现,当常见问题出现时,将它们重构为SPAbstractSprite

至于可触摸的概念,我现在不担心尝试将其命名。采用与上述相同的方法进行处理;在马达或盒子中实现可触摸的支持,然后重构到抽象父类

不过,我是一个非常善于设计和代码交织的人,我完全承认,有些人真的喜欢坐下来,在写一行代码之前画出一组漂亮的方框/行/层次结构


在任何情况下,您都应该注意,Apple提供的类和示例中的类层次结构往往很浅,并且不会进行大量的抽象,尽管抽象仍然被大量使用,但UIView是所有这些子类所需的所有视图(如goop)的抽象容器,例如。

取决于Touchable是否表示每个类必须显式实现以支持的一组随机行为,或者是否可以有一个单独的实现只与继承一起工作,可能需要一些定制

如果是前者,那么你的想法基本上是正确的。如果是后者,那么Jack关于使用@protocol的建议是有道理的,它非常像Java中的接口

就我个人而言,我会保持它非常简单。从一个SPAbstractSprite类开始,该类是CCSprite的子类。然后,将其子类化为SPBox和SPMotor

在SPBox和/或SPMotor中启动您的实现,当常见问题出现时,将它们重构为SPAbstractSprite

至于可触摸的概念,我现在不担心尝试将其命名。采用与上述相同的方法进行处理;在马达或盒子中实现可触摸的支持,然后重构到抽象父类

不过,我是一个非常善于设计和代码交织的人,我完全承认,有些人真的喜欢坐下来,在写一行代码之前画出一组漂亮的方框/行/层次结构


在任何情况下,您都应该注意,Apple提供的类和示例中的类层次结构往往很浅,并且不会进行大量的抽象,尽管抽象仍然被大量使用,但UIView是所有这些子类所需的所有视图(如goop)的抽象容器,例如。

我之前解释过原因

顾名思义,可触摸是物体的一种能力。节点可以触摸,也可以不触摸。此外,这不能局限于精灵。如果以后需要可触摸标签、可触摸粒子效果或其他可触摸节点类,该怎么办

显然,您不能将CCNode子类化为可触摸的,然后将可触摸节点类的子类变回精灵、标签等。因为cocos2d已经建立了类层次结构-这就是这种层次结构系统的不灵活之处,并开始成为一个真正的痛点

你可以在任何时间向任何物体添加这样一种可触杀、飞行、跳跃、驾驶、旋转等能力,你也可以在任何时间将其拿走。这使它成为了一个候选人。任何能力,特别是那些可能是临时的能力,都不应该是超类的一部分,而是可以添加到现有对象中的附加对象,并根据需要启用/禁用

一种方法是使用节点的userObject属性。编写一个能力容器类,并将其分配给节点的userObject。然后将所需的能力类添加到节点的容器中。然后,节点通过转发更新方法更新userObject容器类,该方法将更新转发给所有功能。还是Abi
容器本身向CCScheduler注册以接收更新。容器类和能力类唯一需要的是对所属节点的弱引用。

我之前解释了原因

顾名思义,可触摸是物体的一种能力。节点可以触摸,也可以不触摸。此外,这不能局限于精灵。如果以后需要可触摸标签、可触摸粒子效果或其他可触摸节点类,该怎么办

显然,您不能将CCNode子类化为可触摸的,然后将可触摸节点类的子类变回精灵、标签等。因为cocos2d已经建立了类层次结构-这就是这种层次结构系统的不灵活之处,并开始成为一个真正的痛点

你可以在任何时间向任何物体添加这样一种可触杀、飞行、跳跃、驾驶、旋转等能力,你也可以在任何时间将其拿走。这使它成为了一个候选人。任何能力,特别是那些可能是临时的能力,都不应该是超类的一部分,而是可以添加到现有对象中的附加对象,并根据需要启用/禁用


一种方法是使用节点的userObject属性。编写一个能力容器类,并将其分配给节点的userObject。然后将所需的能力类添加到节点的容器中。然后,节点通过转发更新方法更新userObject容器类,该方法将更新转发给所有功能。或者容器本身向CCScheduler注册以接收更新。容器类和能力类唯一需要的是对所属节点的弱引用。

我在标记中放置了三次抽象,但没有显示它们:Touchable听起来更像一个协议,而不是一个类。我的物体是可以触摸的。所以它会对触摸事件做出反应。我对Obj-c还比较陌生,你能描述一下它是如何工作的吗?也许是答案形式?我在标签中放了三次抽象,但没有显示出来:触控听起来更像是一个协议,而不是一个类。我的物体是可以触摸的。所以它会对触摸事件做出反应。我对Obj-c还比较陌生,你能描述一下它是如何工作的吗?也许是回答形式?谢谢你的回答。我也是一个设计和编写代码的人,但有时坐下来思考代码的结构是很有用的,因为这样可以减少将来的工作。Touchable表示这些类通过被触摸与用户交互的事实,这意味着它实际上只是作为onTouchBegin onTouchMoved onTouchEnded实现的。我想没有必要对它们进行子类化,但是这样或那样的思维实验又有什么错呢?例如,一个盒子在被触摸时会在玩家和盒子之间创建一个关节,移动时盒子会在关节的范围内移动,释放时会破坏关节。一个马达被触碰就会启动,再次触碰就会停止。嗯,投下一票?哦,不,坐着仔细想想绝对没什么错。谢谢你的回答。我也是一个设计和编写代码的人,但有时坐下来思考代码的结构是很有用的,因为这样可以减少将来的工作。Touchable表示这些类通过被触摸与用户交互的事实,这意味着它实际上只是作为onTouchBegin onTouchMoved onTouchEnded实现的。我想没有必要对它们进行子类化,但是这样或那样的思维实验又有什么错呢?例如,一个盒子在被触摸时会在玩家和盒子之间创建一个关节,移动时盒子会在关节的范围内移动,释放时会破坏关节。一个马达被触碰就会启动,再次触碰就会停止。嗯,投下一票?哦,不,坐着仔细想想绝对没有什么错。