Objective c 是否可以为必须重写的方法创建警告?
我正在阅读,对于类的“抽象性”只在运行时强制执行这一事实,我并不十分满意。如果该方法未在子类中实现,我希望能够显示一些警告。理想情况下,这可以简化为一个或两个定义 有没有巧妙地使用Objective c 是否可以为必须重写的方法创建警告?,objective-c,clang,pragma,Objective C,Clang,Pragma,我正在阅读,对于类的“抽象性”只在运行时强制执行这一事实,我并不十分满意。如果该方法未在子类中实现,我希望能够显示一些警告。理想情况下,这可以简化为一个或两个定义 有没有巧妙地使用uu属性((可用、不推荐使用等))或#警告以及一些谨慎的#pragma-clang诊断推送可以实现这一点 我认为这是可能的;我只是对叮当声了解得不够,弄不明白 编辑: 没有必要告诉我应该使用协议。我已经用过了。我更好奇的是看它是否能做到(更多地了解叮当声),而不是它是否应该做到 我认为这与NSManagedObject
uu属性((可用、不推荐使用等))或#警告
以及一些谨慎的#pragma-clang诊断推送
可以实现这一点
我认为这是可能的;我只是对叮当声了解得不够,弄不明白
编辑:
没有必要告诉我应该使用协议。我已经用过了。我更好奇的是看它是否能做到(更多地了解叮当声),而不是它是否应该做到
我认为这与NSManagedObject
的工作方式类似,要求将属性标记为@synthetic
或@dynamic
。我对此进行了研究,发现在NSManagedObject.h
中,该类被标记为NS\u REQUIRES\u PROPERTY\u DEFINITIONS
,在NSObjCRuntime.h
中,该类被转换为\u属性(objc\u REQUIRES\u PROPERTY\u DEFINITIONS))
。这些内置的
#define是否有一些创造性的用途可以让这项工作顺利进行
编辑#2:
对于那些说抽象超类不是Objective-C方式的人,我将向您介绍:
子类化注释
此类是抽象的,无法实例化
直接的
我喜欢
未经测试的代码,其思想是使用协议类型(可能与类类型组合),而不仅仅是类类型
@interface BaseClass : NSObject
- (void)foo;
@end
@protocol BaseClassProtocol : NSObject
@required
- (void)bar;
@end
@interface SubClass : BaseClass <BaseClassProtocol>
@end
@interface SubClass2 : BaseClass // no <BaseClassProtocol>
@end
// some code
BaseClass <BaseClassProtocol> * obj = [SubClass new]; // good
BaseClass <BaseClassProtocol> * obj = [SubClass2 new]; // warning
@接口基类:NSObject
-(无效)富;
@结束
@协议BaseClassProtocol:NSObject
@必需的
-(b)酒吧;
@结束
@接口子类:基类
@结束
@接口子类2:基类//否
@结束
//一些代码
基类*obj=[子类新建];//好的
基类*obj=[子类2新];//警告
我更喜欢这种方法(这是一种运行时错误,而不是编译时错误)
在您的超类中:
@interface NSSuperclass : NSObject
- (void)execute;
@end
@implementation NSSuperclass
- (void)execute
{
@throw [NSException exceptionWithName:NSInternalInconsistencyException
reason:[NSString stringWithFormat:@"Called %@ on superclass NSSuperclass, this should only be called on subclasses", NSStringFromSelector(_cmd)]
userInfo:@{@"object": self}];
}
@end
然后在子类中重写此方法。好问题。在Java中,有一段时间,人们建议为此使用方面,并让它们生成在编译过程中会出现的警告/错误。您可以定义协议,哪些代理应该实现其方法。这可能不是您想要的,但您可以为所需的方法定义协议,并确保您定义的子类符合此协议。通过这种方式,编译器将告诉您需要实现哪些方法。如果您愿意,您可以进行NSAssert,但关键是Objective-C的构建并不像您所尝试的那样完全虚拟化类。如果你用谷歌搜索Objective-C纯虚拟类,你会发现很多解决方案的尝试你仍然试图以一种非预期的方式使用Objective-C我想这是Objective-C的做法,但我已经知道了协议,它们不是我想要的for@paulrehkugler如果你真的想要C++风格的抽象类,那么使用ObjuleC++,使用C++纯虚函数与C++类,如果子类方法需要调用[SubBar ];这是一个问题,因为基类不能公开实现该协议,因为这样它就不再是抽象的,但它必须在某个地方,否则就不能在子类内调用super bar。可能使用子类内部共享的私有类扩展。m?@malhal没有
[BaseClass bar]
方法,因此从子类调用[super bar]
没有意义。除非您想从子类调用它,子类不应该有任何问题。您需要引发/抛出它,并且应该使用\u cmd
作为方法name@BryanChen是的,我做了编辑。这是我看到很多系统类采用的方式。虽然编译时警告没有\uuuu属性\uuu
,但这很糟糕。是的,奇怪的是,有一个用于requires super,但不用于refires重写。我猜他们想让你使用协议。