Переопределение метода в Objective-C

#java #objective-c #inheritance

#java #objective-c #наследование

Вопрос:

Я программист Java, который начал создавать приложения для iPhone. Я столкнулся с проблемой. Добавьте следующий код (на 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 вызывается метод from House h (запускаемый из построения суперкласса) Program , вызывается метод specialAction from 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];
 

Комментарии:

1. Что произошло, когда вы попробовали это?

Ответ №1:

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

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

/* Building.m */
@implementation Building

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

- (void)specialAction
{
    assert(0 amp;amp; "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 виртуальными.

Комментарии:

1. «Стандартным» способом создания методов в абстрактном классе является отправка doesNotRecognizeSelector сообщения, т.е. [self doesNotRecognizeSelector:_cmd];

2. @sebnow Я не считаю ни то, ни другое «стандартным». На самом деле это была просто иллюстрация. Реализация может принимать несколько форм.

Ответ №2:

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

 @interface House : Building
 

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

 -(void)Update;
 

в доме.h

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

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

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

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

Комментарии:

1. Извините, что не объяснил, но как в примерах java, так и в Objective-C класс <code>House</code> расширяет <code>Building</code>