2013-05-12 5 views
2

Новичок, пытающийся понять наследование. Если я инициализирую новый объект с несколькими свойствами, и я хочу, чтобы другие классы помогали назначать значения этим свойствам, нужно ли создавать экземпляры этих других классов? Визуализация:Objective C Вспомогательные методы

-(ObjA *)init{ 
    self = [super init]; 
    self.property1 = [method from Class A]; 
    self.property2 = [method from Class B]; 
    self.property3 = [method from Class C]; etc... 
    return self; 
} 

Другими словами, если предположить, класс A, B и C должны знать, что объект А, я должен был бы сделать эти методы методы экземпляра класса и инициализировать каждый объект? Есть ли еще один способ сделать это? Спасибо заранее за вашу помощь.

+2

Это не ответ на ваш вопрос, но в целом вы должны направить свой класс, чтобы каждый знал как можно меньше от других. В качестве примера, _Car_ мог знать, что ему нужны четыре объекта _Wheel_, но объект колеса не должен знать о _Car_. Мы нарушаем это правило, чтобы упростить вещи в краткосрочной перспективе, и это укусит позже. Основным исключением из этого правила являются классы Cocoa/Foundation, о которых знают ваши классы. – aLevelOfIndirection

ответ

6

Другими словами, если предположить, класса A, B и C должны знать, что объект А является

НЕТ.


Вы можете просто вызвать метод из ClassA/B/C и т.д. Но тип возвращаемого значения должен совпадать с соответствующим property.

Пусть, то property1 для рода NSString, то ваш метод ClassA должен быть

-(NSString *)methodClassA{ 
    ... 
    return someStringValue; 
} 

Тогда вам нужно использовать:

ClassA *objClassA=[ClassA new]; 
self.property1=[objClassA methodClassA]; 

Или вы можете пойти с методом класса этим :

+(NSString *)methodClassA{ 
    ... 
    return someStringValue; 
} 

и использовать его в качестве:

self.property1=[ClassA methodClassA]; 
+2

+1 даже для части «** NO. **». – 2013-05-12 05:01:49

+0

Спасибо, это было очень полезное объяснение. –

2
assuming Class A, B, and C need to know what Object A is 

Код инициализации объект должен быть автономным, если он не использует функциональные возможности, принадлежащие другой объект, и в этом случае объект действует как клиент, что функциональность. То есть objectA действует как клиент A, B, C (как видно из вашего кода).

Но это не означает, что A, B, C должны знать (иметь зависимость от) объекта A. Делая это, вы говорите, что у них нет причин существовать самостоятельно.

В общем,

  • Каждый класс или метод должен иметь один инкапсулированные цели. Это упрощает понимание, изменение и тестирование в изоляции. Это общий шаблон для создания классов, единственной целью которых является инкапсуляция информации для создания другого класса, но разделение этого на три разных класса сверх странно (как, например, я не могу представить себе пример).

  • Нельзя допускать существование объекта в непригодном для использования состоянии, а также при необходимости его не требует существенной информации. Требует ли objectA эти свойства для работы? если это так, ваш код прав, если это не так, инициализатор предоставляет слишком много информации и делает его менее многоразовым.

Попытайтесь переосмыслить свои сомнения реальным (а не абстрактным) примером.Вы можете в конечном итоге осознать это самостоятельно.

Смежные вопросы