Предположим, у меня есть класс BaseClass в BaseClass.h . Я хочу создать SubClass и унаследовать его от моего BaseClass , так просто. НО я хочу сделать наследование в интерфейсе SubClass.

 // SubClass.h
//#import "BaseClass.h" -I dont want to make import to the header (Better convention - I think so).
//@class BaseClass; - That will work only for declaring an instance/property.

@interface SubClass : BaseClass{

 }

Я также хотел бы сохранить оба класса в отдельных файлах. Есть ли у меня простое / элегантное решение, например, для группировки моих классов в проекте Xcode, чтобы они могли узнавать друг друга.

0
Mike.R 5 Апр 2014 в 22:31
Почему вы не хотите делать #import?? Это достаточно просто. Да, вы можете использовать файл .pch, но это имеет тенденцию создавать странные ошибки.
 – 
Hot Licks
5 Апр 2014 в 23:40
Дело не в том, что я "не хочу". Я только что прочитал, что лучше (какое-то соглашение) поместить весь ваш импорт в файл .m и использовать @class в файле .h, но в этом случае это не сработало. Вот я и подумал, может есть другой вариант? а может и нет.
 – 
Mike.R
6 Апр 2014 в 00:13
А теперь вам сказали ответ: "нет".
 – 
matt
6 Апр 2014 в 00:27
Попробуй это. В Xcode в своем проекте создайте новый подкласс UIView (выберите «Файл» > «Создать», «iOS» > «Cocoa Touch» > «Класс Objective-C», класс MyView, подкласс UIView. Теперь сделайте то же самое еще раз, но на этот раз сделайте его MyOtherView, который подкласс MyView. Посмотрите на OtherView.h. Они импортировали MyView.h! Именно то, что вы отказываетесь делать. И обратите внимание: если вы уберете этот импорт, проект не скомпилируется!
 – 
matt
6 Апр 2014 в 00:38
Однако вы можете убрать импорт UIKit из заголовка MyView, и все по-прежнему будет работать. Почему? Поскольку файл .pch импортирует UIKit, и, следовательно, все остальное импортирует его неявно.
 – 
matt
6 Апр 2014 в 02:55

3 ответа

Лучший ответ
//#import "BaseClass.h"

Раскомментируйте эту строку. Вы должны импортировать заголовок суперкласса, чтобы сделать его его подклассом. Я не понимаю, что вы возражали против этого.

3
matt 5 Апр 2014 в 22:37
Спасибо, Мэтт, как я уже писал в своем вопросе, единственное возражение состоит в том, чтобы избегать объявления Cycling, и, насколько мне известно, сейчас не «очень» правильно вставлять импорт в файл заголовка.
 – 
Mike.R
5 Апр 2014 в 22:59
Я не знаю, что сказать, кроме как повторить свой ответ. Независимо от того, что вы думаете, что знаете, то, что я говорю делать, это то, что вы должны делать.
 – 
matt
5 Апр 2014 в 23:00
Также имейте в виду, что #import не является #include. Это предотвращает цикличность.
 – 
matt
5 Апр 2014 в 23:01
Я действительно не знаю, как это объяснить, НО мне каким-то образом удалось выполнить это для двух других классов (или, может быть, это какая-то ошибка Xcode), чтобы я мог видеть свой класс в другом заголовке, не импортируя его.
 – 
Mike.R
5 Апр 2014 в 23:02
2
@Mike.R - Если единственной ссылкой на класс является объявление переменной-указателя или параметра-указателя, то (очень немного) лучше просто сделать @class, а не #import. Это экономит незначительное количество времени компиляции и, в очень сложных сценариях, позволяет избежать проблем с порядком включения. Но в качестве общей стратегии оно того не стоит. И вы не можете избежать включения .h, если вы объявляете фактическую переменную типа класса (вместо указателя), ссылаетесь на метод класса или создаете подкласс класса. Это справедливо как для C++, так и для Objective-C.
 – 
Hot Licks
6 Апр 2014 в 01:43

Вы должны импортировать суперкласс, в противном случае ваш подкласс не имеет ссылки на то, что строить. В вашем subclass.h вы должны #import "BaseClass.h". У вас не должно быть проблем с циклическим включением, потому что #import использует защиту заголовков для решения этой проблемы.

2
Brian Tracy 5 Апр 2014 в 23:18

В проекте xcode есть один файл, известный как файл .pch. В этот файл вы можете импортировать файлы заголовков. После этого нет необходимости импортировать и другие файлы заголовков. Но убедитесь, что импортируемый файл используется во всех файлах.

1
Hussain Shabbir 5 Апр 2014 в 23:33
Я думаю, что файл .pch будет импортировать все в источник, а не в заголовок.
 – 
Mike.R
5 Апр 2014 в 23:50
Это то, что я упомянул в ответе.
 – 
Hussain Shabbir
5 Апр 2014 в 23:52