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重写。我猜他们想让你使用协议。