Структурирование составного объекта в задаче C? - PullRequest
0 голосов
/ 14 февраля 2011

В настоящее время я изучаю использование составного объекта и у меня есть несколько вопросов.

  1. Почему и когда мне следует использовать составной объект?Используем ли мы его только тогда, когда у нас есть класс, мы хотим использовать его экземпляры, но с совершенно разными методами?

  2. Учитывая, что я хочу создать класс Square из класса Rectangle (я называюэто Shape), но не планирует использовать initWithHeight: andWidth: в классе Shape.Это означает, что я объявлю квадратный заголовок таким образом.

С файлом заголовка

@interface Square : NSObject {
    Shape *square;
}

- (Square*) initWithSide: (int) s;
- (void) setSide: (int) s;
- (int) side;
- (int) area;
- (int) perimeter;
- (id) free;
@end

С реализацией

@implementation Square
- (Square*) initWithSide: (int) s
{
    if(self = [super init])
    {
        square = [[Shape alloc] initWithHeight:s andWidth:s];
    }

    return self;
}
- (void) setSide: (int) s
{
    [square setHeight:s];
    [square setWidth:s]; 
}
- (int) side
{
    return [square width];
}
- (int) area
{
    return [square width]*[square height];
}
- (int) perimeter
{
    return 2*([square width]+[square height]);
}
- (id) free
{
    [square release];
    return square;
}
@end

Вопрос: AmЯ делаю это правильно?Есть ли лучший или более аккуратный способ структурирования составного объекта, так как я нахожу код, который я написал, довольно странным.Особенно способ освободить выделение памяти.Поскольку у меня в главном файле есть [mySquare release], это означает, что мне нужно сначала [mySquare free] перед [mySquare release].Могу ли я объединить их, чтобы мне нужно было только вызвать [mySquare release], чтобы освободить обе памяти?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2011

Я наткнулся на ваш пост.Хотя я не отвечаю на ваш вопрос: я только что создал пример проекта , работающий с составным шаблоном .Возможно, это поможет.
В примере я пытаюсь создать интерфейс FooProtocol для доступа к конкретным типам FooObject и FooCollection теми же методами.Таким образом, ясно, какой тип имеет объект.- Вы можете найти примеры в EnumerableCompositeAppDelegate.Просто скомпилируйте и запустите проект.

0 голосов
/ 14 февраля 2011

Кроме странного и неправильного метода free и отсутствующего dealloc (при условии, что вы не используете сборщик мусора), который выглядит абсолютно нормально.

И я, вероятно, не назвал бы переменную экземпляра square.

Кроме того, вы можете рассмотреть тест в -init, чтобы убедиться, что square успешно выделен:

- (id) initWithSide: (int) s
{
    self = [super init];
    if(self != nil)
    {
        square = [[Shape alloc] initWithHeight:s andWidth:s];
        if (square == nil)
        {
            [self release];
            return nil;
        }
    }
    return self;
}

И тип возвращаемого значения инициализатора всегда должен быть id


Редактировать: для метода dealloc

-(void) dealloc
{
    [square release];
    [super dealloc];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...