#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>