Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 通过超类中声明的方法实现协议?_Objective C_Protocols - Fatal编程技术网

Objective c 通过超类中声明的方法实现协议?

Objective c 通过超类中声明的方法实现协议?,objective-c,protocols,Objective C,Protocols,我想知道,在某个子类中,是否有可能“识别”在其超类中声明的方法作为该子类所遵循的协议中声明的方法的实现,因为它们具有相同的签名 这甚至有点难以解释,这就是为什么我做的任何搜索到目前为止都没有结果 但让我举个例子来说明这一点,以便更好地理解 协议: @protocol TheProtocol <NSObject> - (void)theProtocolMethod; @end 子类: // SubClass adheres to TheProtocol but does not

我想知道,在某个子类中,是否有可能“识别”在其超类中声明的方法作为该子类所遵循的协议中声明的方法的实现,因为它们具有相同的签名

这甚至有点难以解释,这就是为什么我做的任何搜索到目前为止都没有结果

但让我举个例子来说明这一点,以便更好地理解

协议:

@protocol TheProtocol <NSObject>

- (void)theProtocolMethod;

@end
子类:

// SubClass adheres to TheProtocol but does not implement it's methods
// since they are implemented in the class it is subclassing. Is this OK?
@interface TheSubClass : TheSuperClass <TheProtocol>

@end

@implementation TheSubClass

@end
//子类遵循协议,但不实现其方法
//因为它们是在类中实现的,所以它是子类化的。这样行吗?
@接口子类:超级类
@结束
@子类的实现
@结束
这是否接近“正常”?
那么这个案例呢?子类实际上是一个超类(声明遵守
协议)的类别,而不是一个子类

多一点背景:


这是一个涉及核心数据的场景。我需要发布一个实体类中定义的访问器,该访问器使用的协议将在单独的框架中用于为我的应用程序开发插件。协议本身完全由核心数据实体类的一个类别实现,除了在实体类本身中实现的上述访问器之外,因此我的问题是。

从绝对意义上讲,这是完全合法的。调用
-如果
子类
本身没有实现,那么对
子类
的实例调用
protocolmethod
确实会调用
父类
实现。如果需要,您甚至可以在子类实现中调用
[super theProtocolMethod]

如果
子类
超类
上的一个类别,则仍将调用超类实现。但是,在类别中实现
——protocolmethod
将取代超类实现,因此在这里您必须小心


主观上,在代码设计方面,这可能有点奇怪。实际上,您需要管理同一方法的两个独立声明,如果您尝试重构,这可能会导致问题。我猜您的超类是一个不能更改的库类。否则,我看不出为什么超类不应该只符合协议,而不是单独声明方法。

理论上,你是说超类已经符合协议了


如果编译器抱怨,您可以在子类中实现包装器方法,该方法只需调用super并从调用super返回任何返回值

你试过看它是否有效吗?如果它不起作用,它应该抱怨你没有从协议中实现一个方法,但是如果它起作用,那么应该没有警告。我最终尝试了类别替代方案。事实上,没有出现任何警告。从基类中删除方法声明会引发关于未实现方法的警告。所以我想他最终会成功的。谢谢你的回答。在这个问题上,我不考虑在子类或类中实现该方法,所以我猜想替换和维护多个实现不会是个问题。我还编辑了我的问题,以提供更多的上下文(关于核心数据)。超级类接口中的重复声明的优点是,您可以使用NS_REQUIRES_super标记它,这在协议中是无法做到的。但是,您也可以添加一个TheSuperClassSubclass.h头,该头具有一个category@接口TheSuperClass(受保护),然后将其包含在subclass.m文件中,并在TheSuperClass.m文件中添加一个类扩展名TheSuperClass(),以帮助您确保获得了所有方法。
// SubClass adheres to TheProtocol but does not implement it's methods
// since they are implemented in the class it is subclassing. Is this OK?
@interface TheSubClass : TheSuperClass <TheProtocol>

@end

@implementation TheSubClass

@end