我有一个攻击方法,我试图在类'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'会对它进行排序,但我还没有成功使用它们。
感谢。
答案 0 :(得分:4)
这听起来像是面向对象的一般设计问题,而不是Objective-C特有的。
您不应该使用一系列知道每个Paragon类的if语句。这样做意味着你的Enemy类与每个Paragon子类紧密耦合:如果你想添加一个新的Paragon子类,你还必须更新Enemy。
相反,每个Paragon子类都应该覆盖underAttackByEnemy:
方法,并且可能覆盖从attackParagon
调用的Paragon上的任何方法。这样,您的子类就会知道攻击正在发生,并且可以执行任何特定于他们的逻辑,同时允许Enemy只知道Paragon,而不是所有Paragon的子类。所有Paragon子类中共同的攻击逻辑应该在Paragon中实现,然后从子类调用:例如,[super underAttackByEnemy:enemy]