Цель C - инициализация унаследованных переменных объекта подкласса - PullRequest
3 голосов
/ 08 января 2010

У меня есть класс MyClass. Я преувеличиваю здесь, но допустим, MyClass имеет 1000 переменных экземпляра. Затем я создаю подкласс MySubClass со всеми переменными экземпляра, имеющимися в MyClass, плюс еще одну.

Вопрос: учитывая объект MyObj класса MyClass, существует ли простой способ создать соответствующий объект MyDerivedObj класса MySubClass, чтобы переменные экземпляра MyDerivedObj были такими же, как переменные экземпляра MyObj? Под «тем же» я имею в виду то же самое в том смысле, что если переменная экземпляра MyObj является указателем на объект, соответствующая переменная экземпляра MyDerivedObj должна указывать на ту же память.

Ответы [ 4 ]

1 голос
/ 08 января 2010

По сути, каждый экземпляр объекта будет иметь различный идентификатор; другой адрес и другая точка выделения в куче.

Таким образом, переменные экземпляра A и переменные экземпляра B всегда будут находиться в разных местах .

Теперь нет причины, по которой переменные экземпляра A и B не могут быть заключены в структуру, которая размещается отдельно. При этом тогда A и B могут иметь переменную экземпляра, которая является указателем на одну копию структуры, полной значений.

С точки зрения установки всех 1000 иваров, это также зависит от того, что вы хотите их установить. Если 0, то они будут установлены таким образом автоматически при создании объекта. Если вы хотите bcopy() в шаблонном наборе значений, я бы посоветовал вам использовать указатель на структуру и делать отдельное выделение. Невозможно массово установить переменные экземпляра объекта, не делая предположений о макете, который в конечном итоге вас укусит.

1 голос
/ 08 января 2010

Должны ли эти ивары быть отдельными? Если бы у меня была похожая проблема, мой первый инстинкт заключался бы в том, чтобы обернуть их в какую-то коллекцию ivar (NS (Mutable) Array / Dictionary / Set), и тогда у вас может быть обычный getter / setter и просто сделать

myDerivedObj.collection = myObj.collection;

Предполагая, что коллекция была свойством класса MyObj с политикой управления памятью "assign", я думаю, что это должно сохранить ссылку на память.

(Я все еще новичок в этом, так что устраните все недостатки / ошибки в моей логике.)

0 голосов
/ 08 января 2010

Я предлагаю вам создать инициализатор стиля 'copy constructor' для родительского класса MyClass и вызвать его из дочернего класса MyDerivedClass initializer.

[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 для всех, кроме чувствительных к производительности, что сделает вашу initByCopying процедуру намного проще.

Может быть ярлык для реализации конструктора копирования с использованием протокола копирования, но я не мог понять, как сделать это проще, чем в приведенном выше примере.

0 голосов
/ 08 января 2010

Если ивары помечены как @public или @protected, да, они будут точно такими же.

...