Objective-c通过baseclass调用子类

时间:2013-10-04 14:53:32

标签: objective-c

我有一个攻击方法,我试图在类'Enemy'中实现,它将调用类'Paragon'的子类。

子类是通过.h文件中的@interface创建的,并在.m。

中实现

这是我目前在Enemy类中所述的攻击方法:

-(void)chosenParagonForAttack:(Paragon*)paragon{
    _paragonLink = nil; //_paragonLink, is an object of class Paragon.
    _paragonLink = paragon;
    [self attackParagon];
    [paragon underAttackByEnemy :self];
}

我得到的问题是,由于实际的paragon是由子类创建的,因此攻击不会发生。子类定义了一个不同的“paragon”,具有不同的图像和数据等。

有没有办法调用子类只是说明基类(Paragon)?

我可以通过创建一个包含Paragon类的每个子类的if语句来解决这个问题,但是我有兴趣找出是否有更好的方法来解决这个问题。

我在想'isSubclassOfClass'或'isKindOfClass'会对它进行排序,但我还没有成功使用它们。

感谢。

1 个答案:

答案 0 :(得分:4)

这听起来像是面向对象的一般设计问题,而不是Objective-C特有的。

您不应该使用一系列知道每个Paragon类的if语句。这样做意味着你的Enemy类与每个Paragon子类紧密耦合:如果你想添加一个新的Paragon子类,你还必须更新Enemy。

相反,每个Paragon子类都应该覆盖underAttackByEnemy:方法,并且可能覆盖从attackParagon调用的Paragon上的任何方法。这样,您的子类就会知道攻击正在发生,并且可以执行任何特定于他们的逻辑,同时允许Enemy只知道Paragon,而不是所有Paragon的子类。所有Paragon子类中共同的攻击逻辑应该在Paragon中实现,然后从子类调用:例如,[super underAttackByEnemy:enemy]