我开始使用Objective-C,我正在对MusicCollection和播放列表进行练习。 MusicCollection有一个主播放列表,其中包含其他播放列表中包含的所有歌曲。我不想让用户在没有立即添加到音乐库的情况下创建播放列表。这样,用户可以创建播放列表,然后立即向其添加歌曲,它将反映在主库中,而无需稍后手动添加。所以这是我在MusicCollection中的初始化:
- (id) initWithName: (NSString *)aName
{
self = [super init];
if(self)
{
name = aName; // name of MusicCollection
collection = [NSMutableArray array]; // array of Playlist objects
// Now I'm making a playlist which I want to be designated
// as the master playlist.
library = [[Playlist alloc] initWithName:@"Library"
underCollection:self];
}
return self;
}
现在我不确定播放列表init方法中的逻辑。如果还没有创建正确的MusicCollection,我不想让用户创建播放列表对象。这就是我所拥有的:
- (id) initWithName: (NSString *)theName underCollection:(MusicCollection *)theMusic
{
self = [super init];
if(self)
{
name = theName;
songs = [NSMutableArray array];
if([theMusic.collection count] == 0)
{
NSLog(@"This is the master playlist");
[theMusic.collection addObject:self];
}
else if([theMusic.collection count] != 0)
{
[theMusic.collection addObject:self];
NSLog(@"Adding a regular playlist");
}
}
return self;
}
这对我来说似乎有风险。就像用户可以尝试创建一个播放列表,其中一些MusicCollection通过在播放列表上调用init方法而未正确初始化。有更好的方法吗?
答案 0 :(得分:2)
您可以覆盖-init
课程中的Playlist
:
- (id)init
{
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Use -initWithName:underCollection: instead" userInfo:nil];
}
答案 1 :(得分:0)
您可以覆盖播放列表的init方法并添加这些检查,或者让它抛出异常,以便init不能用于制作播放列表。