Objective c 目标C——初始化子类对象的继承变量

Objective c 目标C——初始化子类对象的继承变量,objective-c,object,initialization,subclass,Objective C,Object,Initialization,Subclass,我有一门课,我的课。这里我有点夸张,但假设MyClass有1000个实例变量。然后,我创建了一个名为MySubClass的子类,其中包含MyClass拥有的所有实例变量以及一个以上的变量 问题:给定MyClass类的对象MyObj,是否有一种简单的方法来创建MySubClass类的对应对象MyDerivedObj,以便MyDerivedObj的实例变量与MyObj的实例变量相同?通过“相同”,我的意思是非常相同的,即如果MyObj的实例变量是指向对象的指针,那么MyDerivedObj的相应实例

我有一门课,我的课。这里我有点夸张,但假设MyClass有1000个实例变量。然后,我创建了一个名为MySubClass的子类,其中包含MyClass拥有的所有实例变量以及一个以上的变量


问题:给定MyClass类的对象MyObj,是否有一种简单的方法来创建MySubClass类的对应对象MyDerivedObj,以便MyDerivedObj的实例变量与MyObj的实例变量相同?通过“相同”,我的意思是非常相同的,即如果MyObj的实例变量是指向对象的指针,那么MyDerivedObj的相应实例变量应该指向相同的内存。

如果IVAR标记为@public或@protected,是的,它们将完全相同。

,对象的每个实例都有不同的id;堆中的不同地址和不同分配点

因此,A的实例变量和B的实例变量总是在不同的位置

现在,没有理由不能将A和B的实例变量包装到单独分配的结构中。这样,A和B都可以有一个实例变量,它是指向一个充满值的结构的单个副本的指针


就设置所有1000个IVAR而言,这也取决于您想要设置它们的内容。如果为0,则它们将在对象实例化时自动设置为该方式。如果您想在一组模板化的值中
bcopy()
,我建议您使用指向结构的指针并进行单独的分配。如果不对布局进行假设,就无法批量设置对象的实例变量,因为布局最终会影响您。

这些IVAR都必须分开吗?如果我有一个类似的问题,我的第一反应是将它们封装在某种集合ivar(NS(可变)数组/字典/集合)中,然后您就可以使用一个普通的getter/setter,只需这样做

myDerivedObj.collection = myObj.collection;
假设集合是MyObj类上具有“分配”内存管理策略的属性,我认为这应该保留内存引用


(我对这一点还是有点陌生,所以请消除我逻辑中的任何缺陷/错误。)

我建议您为父类
MyClass
创建一个“复制构造函数”样式的初始化器,并从子类
MyDerivedClass
初始化器调用它

[MyDerivedClass initByCopying:someMyObject plusSomeNewProperties:stuff] ->
  [MyClass initByCopying:someMyObject] ->
    [NSObject init] -> // alloc, etc.
下面是一些伪代码:

@interface MyClass : NSObject { 
  int AA;
  // ...
  int ZZ;
}   
@end

@implementation MyClass

-initByCopying:(MyClass*)other;
{
  if (self = [super init])
  {
    self.AA=other.AA;
    //...
    self.ZZ=other.ZZ;
  }
  return self;
}

@end

@interface MyDerivedClass {
  int AAA;
}
@end

@implementation MyDerivedClass 

-initByCopying:(MyClass*)other withNewValue:(int)newVar;
{
  if (self = [super initByCopying:(MyClass*)other])
  {
    self.AAA = newVar;
  }
  return self;
}

@end

我怀疑如果你有1000个成员项目,你可能想考虑使用一个属性包或KVC,而不是性能敏感的,这会使你的<代码>拷贝[< /Cord>>例程]要简单得多。


使用复制协议实现复制构造函数可能有一个捷径,但我看不出如何比上面给出的示例更简单。

但可能我误解了您的问题。你想覆盖你的子类中的IVAR吗?不,我不想覆盖任何东西。但是我怎么做MyDerivedObj的赋值呢?我要寻找的是一种快速设置所有1000个IVAR的方法。同意,这个问题似乎暗示了一个更大的问题。谁在一个类中需要一千个实例变量??!!我没有1000个IVAR。为了把基本问题弄清楚,我夸大了。主要的一点是,ivar数量足够多(基类仍然有可能发生变化),如果我不得不一个接一个地复制它们,我应该做的是在不进行子类化的情况下处理整个事情。