类方法错误,Objective C



我试图使类方法(我不想要实例方法和变量)在Objective-C中的计算器类,但我遇到了问题。我有下面的。h文件:

#import <Foundation/Foundation.h>
@interface Calc : NSObject
{
NSNumber* accumulator;
}
//Acumulator Methods
+ (void) setAccumulator: (NSNumber *) value;
+ (void) clear;
+ (NSNumber *) accumulator;
//Arithmatic metods
+ (void) add: (NSNumber *) value;
+ (void) subtract: (NSNumber *) value;
+ (void) multiply: (NSNumber *) value;
+ (void) divide: (NSNumber *) value;
+ (void) setCurrentOperation: (NSString *) o;
+ (NSString *) currentOperation;

然后,当我尝试在.m文件中定义任何一个方法时,我收到错误:"在类方法中访问的实例变量'x'"。我的.m文件中的一个方法示例,错误是:

+ (void) setAccumulator: (NSNumber *) value
{
      accumulator = value;
}

也许有人解释为什么这个错误发生,并帮助我修复它?谢谢!

如错误提示所示,不能在类方法中访问实例变量,因为实例变量属于实例,而不属于类。根据定义,类方法没有链接到实例,因此没有实例变量可供更改。

一般来说,类方法应该有存在的理由。例如,用于返回特定类的实例的工厂函数是类方法的良好候选者,因为它与该类密切相关。否则,如果您有一个不需要访问任何实例数据的方法,那么通常最好将其实现为独立函数。Objective-C不像Java,所有东西都必须塞进一个类,不管它是否属于一个类。

如果您不想要实例变量,那么不要尝试使用它们—在本例中,accumulator是您试图使用的实例变量。

当我看到这样的代码时,它让我认为你真的只是在滥用面向对象编程…

你应该把这些对象看作是不同的机器。我猜你在某些时候需要不止一个计算器……所以你不应该使用类方法。你的数据应该包含在计算器的实例中…

如果你想使用类方法,你会做一些事情,比如改变所有计算器的属性,比如你可能想改变定点计算的默认精度,或者类似的事情,或者使用一个乘法算法胜过另一个……但一般来说,你只会用那些值初始化单个对象的属性,而不会让类方法改变已经初始化的对象。这对于封装来说要好得多。

最新更新