如果我创建ClassA,它是ClassB的子类
@interface ClassA : ClassB
我想从超类ClassB
中触发子类ClassA中的实例方法怎么做?
感谢
答案 0 :(得分:2)
设计问题。你违背了继承的基本原则。 参考OOP书籍。
首先,超类不知道子类中有什么。但是允许相反。
如果你想这样做,你需要在Superclass中创建一个Subclass实例,然后调用它。
其他方法是使用协议:
您可以声明协议并让您的子类采用该协议 协议。然后你可以检查孩子是否采用了那个 来自超类的协议并从super调用该方法 类。
答案 1 :(得分:1)
我想从超类ClassB
中触发子类ClassA中的实例方法
这取决于具体情况。如果该方法是重写的实例方法,则只需调用它即可。也就是说,假设你在ClassB和ClassA中有一些方法会覆盖其中的一些方法:
@implementation ClassB
- (void)foo:(ClassB)b
{
[b bar];
}
- (void)bar
{
NSLog(@"I'm ClassB");
}
@end
@implementation ClassA
- (void)bar
{
NSLog(@"I'm ClassA");
}
@end
现在,如果你有一个ClassA实例:
ClassA *a = [[ClassA alloc] init];
您致电foo
[a foo:a];
然后调用ClassA的bar
版本,你得到了这个:
I'm ClassA
另一方面,如果你希望ClassB在ClassA中调用一些未在ClassB中声明的方法,你应该先考虑三次。让一个类知道它的子类的特定事物通常表明你应该重构你的代码。如果父类对子类有期望,那么通常需要通过声明父类中的方法然后要求覆盖这些方法来明确这一点。
如果您确定要这样做,一种巧妙的方法是创建一个包含方法声明的协议。然后,ClassB.h
可以导入协议标头,而无需具体了解ClassA。所以假设您有一个名为ProtocolC的协议:
@protocol
- (void)baz;
@end
并且在某些情况下,您希望要求您使用的对象符合该协议。您可以像这样指定“采用ProtocolC的ClassB实例”:
ClassB<ProtocolC>* someObject;
如果您想从ClassB致电baz
,可以像这样重写foo:
:
@implementation ClassB
- (void)foo:(ClassB<ProtocolC>*)b
{
[b baz];
}
@end
现在您只需要在ClassA中采用ProtocolC并实现这些方法。还有其他可能性,但在这里使用协议将有助于保持整洁。
我猜想要这样做的原因是你知道你不会直接使用ClassB,而是创建一个或多个子类并改为使用它们。也就是说,ClassB是一个抽象类,即使Objective-C没有区分抽象类和具体类。如果这是使用,您应该跳过协议业务,在ClassB中声明您的抽象方法,并以提醒您在子类中提供更有用的实现的方式实现这些方法。例如,您的“抽象”方法可能都会抛出异常。
答案 2 :(得分:0)
在超类中声明方法并在子类中实现它。