С другой стороны, если Вы хотите получить идентификаторы для каждой суммы, Вы могли бы сделать это
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));
}
Я не уверен в прямом доступе к переменным экземпляра, думаю, не следует, но для некоторых переменных просто не имеет смысла использовать аксессоры. Как и для IBOutlet
, о которых вы упомянули.
Я могу помочь вам только с частными аксессорами. Начиная с Objective-C 2.0 вы можете объявлять расширения .
Расширения классов похожи на «анонимные» категории, за исключением того, что методы они заявляют, что должны быть реализованы в основной блок
@implementation
для соответствующий класс.
Просто поместите это расширение в отдельный файл заголовка, и у вас будут частные аксессоры, которые не видны в заголовке.
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