Переопределение метода в Objective-C - PullRequest
0 голосов
/ 29 октября 2011

Я Java-программист, который начал создавать приложения для iPhone. Я наткнулся на проблему. Supose следующий код (в Java):

Класс 1 (здание)

public abstract class Building
{
    public void Update()
    {
        specialAction();
    }

    public abstract void specialAction();
}

Класс 2 (Дом)

public abstract class House extends Building
{   
    public abstract void specialAction()
    {
        System.out.println("Special Action Done");
    }
}

Класс работоспособности

public class Program
{   
    public void main(String[] args)
    {
        House h = new House();
        h.Update();
    }
}

Когда метод Update из House h (запущенный из здания суперкласса) вызывается в Program, вызывается метод specialAction из House, и поэтому консоль печатает «Специальное действие выполнено». Мой вопрос: будет ли следующий код в xcode эквивалентным (с точки зрения наследования и переопределения метода, а не вывода на консоль):

Класс 1 (здание): .h файл:

-(void)Update;
-(void)SpecialAction;

.m файл:

-(void)Update
{
    [self specialAction];
}

Класс 2 (Дом, который расширяется или наследуется от Building): .m файл:

-(void)SpecialAction
{
    NSLog("Special Action Done");
}

Класс работоспособности

House* h = [[House alloc] init];
[h Update];

Ответы [ 2 ]

3 голосов
/ 29 октября 2011

Ваш пример выглядит правильно.Полная программа вашего примера Java аппроксимируется в ObjC следующим образом:

/* Building.h */
@interface Building : NSObject
- (void)Update;
- (void)specialAction;
@end

/* Building.m */
@implementation Building

- (void)Update
{
    [self specialAction];
}

- (void)specialAction
{
    assert(0 && "override required"); // << see note
}

@end

/* House.h */
@interface House : Building
@end

/* House.m */
@implementation House

- (void)specialAction
{
    NSLog(@"Special Action Done");
}

@end

void ProgramMain()
{
    House * h = [House new];
    [h Update];
    [h release];
}

Формальные абстрактные методы не встроены в язык, но вы можете аппроксимировать их с помощью протоколов.все методы ObjC должны быть виртуальными.

2 голосов
/ 29 октября 2011

House наследуется от Building?

@interface House : Building

Если это так, вам не нужно реализовывать здесь ваше специальное действие с другим именем. Вы можете объявить

-(void)Update;

в доме.ч

и определите его в House.m как

-(void)Update
{
    NSLog("Special Action Done");
}

и вызов метода Update для объекта House вызовет определение в House.m

P.S. Поскольку вы новичок в iOS, я хотел бы упомянуть соглашение, согласно которому: имена классов, такие как «House», начинаются с заглавной буквы; имена методов и имена переменных начинаются со строчных букв.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...