0

我正在为 iphone 开发一款 rpg 类型的游戏。我想要做的是拥有一个仅允许您持有特定数量的特定类型物品的库存。我认为要做到这一点,我只是要扩展 NSMutableArray 并为其添加限制。我想不出最好的方法来做到这一点。这是我脑海中的想法......

背包.h

@interface Backpack : NSMutableArray {
  Class * arrayClass;
  NSMutableArray * array;
  int limit;
}

-(id) initWithClass:(Class) type andLimit:(int) num;

@end

背包.m

@implementation Backpack

  -(id)initWithClass:(Class) type andLimit:(int) num {

    arrayClass = type;
    limit = num;
    array = [NSMutableArray new];
    return self;

  }

  -(void)insertObject:(id) object atIndex:(int) index {

    if([object isKindOfClass:arrayClass] && index < limit) {
      // Insert it
    } else {
      // Throw Exception
    }

  }

@end
4

2 回答 2

5

与其扩展 NSMutableArray,不如创建您自己的类,该类使用 NSMutableArray 的实例来保存项目。您的类可以有一个或多个方法,这些方法要求添加的项目属于某个类类型(或实现特定接口)。至于限制项目的数量,在您的 addItem 方法中,首先检查所持有的项目数量。如果它大于您的限制,则不允许添加该项目。最后,您的类可以公开一个 size 方法(例如 getSize()),它告诉您在 NSMutableArray 的实例内部已经保存了多少项目,这样您可以防止在背包“满”时添加项目。

一般来说,组合(即从其他类的成员实例组合您自己的类)比扩展类和使用继承来完成相同的行为要好。例如,如果您扩展 NSMutableArray,则生成的类将公开该类的所有公共方法,除了您的方法之外,从代码重用和文档的角度来看,这会导致类混乱。

最后,您的问题实际上与 Java 无关,所以也许这不应该用 Java 标记来标记。

于 2012-07-26T00:30:45.897 回答
1

您想要施加的限制实际上并不需要类扩展,如果有任何使使用混淆和难以编写的东西。

只需保持简单,并将一些与库存相关的方法添加到自定义 Player 类之类的东西中,您可能希望在制作 RPG 的过程中设计某个地方。

@interface Player : NSObject {
  NSMutableArray * inventory;
  NSUInteger inventoryLimit;
  //other centralized player data like stats, spells, or whatever
}
-(BOOL)addItemToInventory:(YourItemClass *)item;
@end

@implementation 
//... other impl stuff, like init
-(BOOL)addItemToInventory:(YourItemClass *)item {
  if([inventory count] < inventoryLimit) {
    [inventory addObject:item];
    return TRUE;
  }
  else {
    return FALSE;
  }
}
@end

请注意,我对“玩家”课程的建议并不是硬性要求。您可以通过多种方式为游戏构建类和数据...

于 2012-07-26T00:45:41.993 回答