【问题标题】:Initializing a subclass in objective c在目标 c 中初始化子类
【发布时间】:2012-07-29 21:12:22
【问题描述】:

我认为这可能是不可能的,但我试图在我的超类“加载”中编写一个静态初始化程序,它甚至可以初始化我的子类。

+ (id) load
{
    Class c = [self class];
    NSString *cString = NSStringFromClass([self class]);
    NSLog(@"%@",cString);

    id a = [[c alloc] init];
    [a autorelease];
    return a;
}

这里 [self class] 的结果是超类,但我想初始化类本身(在这种情况下,它将始终是子类)。也许这只是一个糟糕的编程想法。

【问题讨论】:

  • 有什么特殊原因需要从超类初始化子类吗?在创建任何一个类的任何实例或调用任何静态方法之前,这两个类都被初始化。
  • 你是在说创建一个单例类吗?
  • 告诉我们您想要达到的目标,我们或许可以提出更好的解决方法。就目前而言,我不知道您要完成什么,因此无能为力!
  • 我和@FranciscoSilva 一起讨论这个问题,这没有任何意义。如果您需要子类的实例,请使用您的子类进行初始化。 super 不应该知道它的子类。
  • 可以说我有一个类 a 具有某些要在初始化时运行的操作,它会保留自己并在完成后释放自己。所以类b继承自类a,所以每次我想使用类b或c或d等时我必须输入[[[b alloc] init] release],这对我来说有点难看,它的作用不是如此明显。我想用[b load]替换[[[b alloc] init] release],但是我想在a中定义load,否则将load复制粘贴到b,c,d中是浪费时间(继承自 a)。

标签: objective-c alloc


【解决方案1】:

我必须输入 [[[b alloc] init] release],这对我来说有点难看 而它的作用并不那么明显。

我不同意。这段代码在做什么是非常明显的。它正在分配B类(顺便说一下,类要大写),初始化它,然后释放它。

[b 加载]

另一方面,这只是告诉我 b 正在加载的事实。什么是加载?它会分配和初始化吗?

我想在a中定义load,否则将load复制粘贴到b,c,d(从a继承)是浪费时间

这是难看的,它的作用不是那么明显。此外,类真的不应该知道它们的子类。

恕我直言,您的解决方案不是很好。这样做的方法是让超类有一个加载方法(我更喜欢一个具有更具描述性的名称的指定初始化程序),其中包含所有常见功能。然后,在您的子类中,重写您的加载方法以调用超级实现,然后为该特定子类添加您需要的任何代码。

【讨论】:

  • 根据您的回答,可以实现一个返回其类的子类方法。我实际上已经在使用这种模式。负载对我来说是显而易见的,因为它不包括超然或新的,我知道我不拥有该对象。
猜你喜欢
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
  • 2021-03-23
  • 2013-02-01
  • 1970-01-01
  • 2021-12-10
  • 2018-02-23
  • 2015-11-12
相关资源
最近更新 更多