【问题标题】:Set default value TRUE of BOOL while implementing abstract class in Objective C在Objective C中实现抽象类时设置BOOL的默认值TRUE
【发布时间】:2013-10-21 07:12:12
【问题描述】:

我正在编写类似于 C# Abstract 类的 Objective C 类。我需要在抽象类实现中将 BOOL 变量分配给 TRUE。正如我在Objective C for Abstract 类中所知道的那样,不会有init 方法。那么如何将我的 BOOL 变量默认值更改为 TRUE?

C# 类:

public abstract class ABC
{
      private bool isNew = true;
}

如何在 Objective C 中实现相同的功能?

【问题讨论】:

  • 你应该在你的类中重写 init 方法。 stackoverflow.com/questions/10704291/…
  • 您还可以反转变量的含义,因此它可以默认为 NO。例如,isOld 而不是 isNew。否则,请按照其他人的建议覆盖 -init
  • @nielsbot 你真的需要添加评论说你已经添加了答案吗?

标签: ios objective-c


【解决方案1】:

首先,Objective-C 本身没有抽象类的概念,您只需创建一个您不打算为其创建实例的类。因此,编译器不会强制执行“抽象”性质(尽管如果确实需要,您可以选择在代码中强制执行它)。

所以“抽象”只是一个类,它可以有一个init 方法——这就是您需要为实例变量设置默认值的方法。

【讨论】:

  • 我参考了这个博客来实现抽象类iphonesdkbasics.blogspot.in/2010/01/… - 在这个[self doesNotRecognizeSelector:_cmd]; 中有 init 方法。是不是执行错误?
  • 对我来说似乎很沉重。我什至不会执行“不要实例化我”规则,只需在头文件中添加一个注释即可。 “嘿,不要实例化这个类”。如果你真的想强制一个类的抽象性,请将以下内容添加到你的 -init 方法中:if ( [ self class ] == [ MyAbstractClass class ] ) { @throw ...don't instantiate MyAbstractClass exception... ; }
  • @nielsbot - 如果我不实例化,那么如何更改我的变量默认值?
  • @Cintu - 不直接实例化抽象类,仅实例化从它派生的子类。作为任何类的init 的一部分,您调用超类的init - 这是在调用抽象方法的init 并设置实例变量的默认值时。
  • @Cintu - 有多种方法可以生成“抽象”类 - 从简单的不实例化类到重量级解决方案的简单方法。查看this answer 以获得中等重量的解决方案。
【解决方案2】:

以下是如何拥有一个“抽象”类来初始化非零成员变量:

// ABC is an abstract class--not to be instantiated directly, but subclassed

@interface ABC : NSObject
@property ( nonatomic ) BOOL isNew ;
@end

@implementation ABC
-(id)init
{
    self = [ super init ] ;

    if ( [ [ self class ] isEqual:[ ABC class ] ] )
    {
        @throw [ NSException exceptionWithName:NSGenericException reason:@"Warning: class ABC must be subclassed. Cannot directly create instances of class ABC" userInfo:nil ] ;
        return nil ;
    }

    self.isNew = YES ;

    return self ;
}

@end

你的子类应该是这样的:

@interface MyConcreteABCSubclass : ABC
@end

@implementation MyConcreteABCSubclass

-(id)init
{
    self = [ super init ] ;
    if ( self )
    {
        // initialize subclass vars
    }
    return self ;
}

//
// ... your subclass methods go here ...
//

@end

【讨论】:

  • 好的,我认为最好抛出异常,因为这将是一个编码错误。
  • 谢谢。我现在也在做同样的事情。在 ABC 的子类中,我添加了 ABC *obj; if (obj.isNew) { NSLog(@"NEW"); } else{ NSLog(@"OLD"); } 但它没有采用 isNew = YES 的值。它打印为 OLD
  • 你记得在你的子类中调用[super init]吗?如果您的代码在子类方法中,请使用self.isNew
  • 您是否实例化了您的 ABC 子类的实例? ObjC 中没有默认构造函数或类似的东西。声明类型为“ABC*”的变量,你需要这样做:ABC * obj = [[MyABCSubclass alloc] init]
  • alloc 为对象实例创建存储空间,init 在该空间中初始化对象实例。
【解决方案3】:

你必须实现 init 并将所有属性设置为你想要的值

你可以实现getter,只要它们没有设置就返回默认值

【讨论】:

  • 您可以使用NSNumber numberWithBool: 而不是 BOOL,但我认为使用实现init 的原语是一种更好的方法。
猜你喜欢
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 2014-08-16
  • 2014-07-12
  • 2011-01-03
相关资源
最近更新 更多