Я должен всегда использовать средства доступа, например, переменные в Objective C?

С другой стороны, если Вы хотите получить идентификаторы для каждой суммы, Вы могли бы сделать это

var customerAndProductGroups =
    from order in Orders
    orderby order.CustomerID, order.ProductID // orderby not necessary, but neater
    group order by new { order.CustomerID, order.ProductID };

foreach (var customerAndProductGroup in customerAndProductGroups)
{
    Console.WriteLine("Customer {0} has ordered product {1} for a total count of {2}",
        customerAndProductGroup.Key.CustomerID,
        customerAndProductGroup.Key.ProductID,
        customerAndProductGroup.Sum(item => item.ProductCount));
}
6
задан Abizern 5 November 2009 в 11:30
поделиться

2 ответа

Я не уверен в прямом доступе к переменным экземпляра, думаю, не следует, но для некоторых переменных просто не имеет смысла использовать аксессоры. Как и для IBOutlet , о которых вы упомянули.

Я могу помочь вам только с частными аксессорами. Начиная с Objective-C 2.0 вы можете объявлять расширения .

Расширения классов похожи на «анонимные» категории, за исключением того, что методы они заявляют, что должны быть реализованы в основной блок @implementation для соответствующий класс.

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

4
ответ дан 17 December 2019 в 00:11
поделиться

Public / Private

Вы можете объявить свои iVars, как в файле @interface, только для чтения, но затем повторно объявить их в категории, чтобы ваш класс мог их изменить. Вот краткое введение в Категории .

Пример:

//MyClass.h

@interface MyClass : NSObject {
    NSString *name;
}
@property (readonly) NSString *name;

@end

И в файле реализации вы можете повторно объявить это:

//MyClass.m
@interface MyClass () //declare the class extension

@property (readwrite, copy) NSString *name; //redeclare the property

@end

@implementation MyClass

@synthesize name;

@end

Теперь свойство name является только внешним для чтения класс, но может быть изменен классом с помощью синтаксиса свойства или синтаксиса установщика / получателя.

Действительно приватные iVars

Если вы хотите, чтобы iVars были действительно приватными и обращались к ним только напрямую, без использования синтаксиса @property, вы можете объявить их с ключевым словом @private . Но затем вы говорите: «А, но они всегда могут получить значение вне класса, используя методы KVC, такие как setValueForKey: » В этом случае взгляните на метод класса протокола NSKeyValueCoding + (BOOL) accessInstanceVariablesDirectly , который останавливает это.

IBOutlets как свойства

Рекомендуемый способ - использовать @property и @synthesize. Для Mac OS X вы можете просто объявить их как свойства только для чтения. Например:

//MyClass.h

@interface MyClass : NSObject {
    NSView *myView;
}
@property (readonly) IBOutlet NSView *myView;

@end

//MyClass.m

@implementation MyClass

@synthesize myView;

@end
3
ответ дан 17 December 2019 в 00:11
поделиться