例如,我需要实现一个移动的对象。它是左,右,上,下方法。
被修改
以下代码不正确,但我希望它能解释我需要更好的东西:
@interface A : NSObject
...
@end
@implementation A
-(void)up
{
[self moveTo:^{/*block1*/}];
}
-(void)down
{
[self moveTo:^{/*block2*/}];
}
-(void)left
{
[self moveTo:^{/*block3*/}];
}
-(void)right
{
[self moveTo:^{/*block4*/}];
}
-(void)moveTo:(CodeBlock *)b {
//actions before
...
b
//actions after
...
}
@end
答案 0 :(得分:2)
你的问题有点不清楚,但是从Java代码片段来看,你想要在多个类上调用一个方法。这在Obj-C中非常简单,因为它是一种动态语言。您可以简单地将对象转换为类型id
并在其上调用任何方法,只要该对象实现了该方法。
为了更正式地执行此操作,您需要定义协议:
@protocol Drawable <NSObject>
- (void)draw;
@end
然后,任何需要实现此协议的类都可以在标头中声明它:
@interface A : NSObject <Drawable>
然后简单地在A类中实现该方法.C类中的方法签名将变为:
- (void)show:(id<Drawable>)r
{
[r draw];
}
另一个简单的解决方案是使用类层次结构,超类实现-(void)draw
方法,并且需要不同实现的每个子类都可以覆盖它。
答案 1 :(得分:1)
解决方案
我的例子:
-(void)left
{
[self moveTo:^(CGPoint p) {
p.x--;
return p;
}];
}
-(void)moveTo:(CGPoint(^)(CGPoint))block
{
CGPoint p = sprite.position;
p = block(p);
sprite.position = p;
}
右,上下方法与左方法类似。所以不要告诉我这是不正确的问题或解决方案是不可能的
答案 2 :(得分:0)
不确定我是否理解你的意思但你在目标C中使用setter和getters来修改你的变量。因此,在实例对象的实现中,您可以编写直接影响ivars的代码。
我认为您将位置定义为属性,这就是您说不能分配它的原因。
@property (nonatomic) CGPoint position;
但是在实施中如果设置了:
@synthesize position = _position;
然后你可以像这样直接修改它
_position.x++;
这意味着您可以编写类似
的方法-(void) moveLeftBy:(int) x
{
_position.x += x;
}
如果这不是您的意思,请在您的问题中更明确。
答案 3 :(得分:0)
您可以通过检查参数来编写一个处理差异的组合方法:
(void)methodNameCombined:(NSInteger)direction
{
...
switch(direction) {
case 1:
x++;
break;
case 2:
y++;
break;
}
...
}
并从您的特定方法中调用此方法
(void)methodNameUp
{
[self methodNameCombined:1]
}
(void)methodNameRight
{
[self methodNameCombined:2]
}
...