2015-04-30 3 views
0

Файл с файлом Car.m выглядит следующим образом. Здесь у меня есть 1 частный метод engineStarting.Нет видимого @interface для класса

Здесь я использовал концепцию расширения класса, чтобы ввести частный метод , и я также использовал Car+Maintainance как категорию.

#import "Car.h" 

//private methods 

@interface Car() 
-(BOOL) engineStarting; 
@end 


@implementation Car 

@synthesize model=_model; 

-(void)drive{ 
    NSLog(@"%@ is driving",_model); 
} 
-(void)stop{ 
    NSLog(@"%@ has stopped now",_model); 
} 
-(void)turnleft{ 
    NSLog(@"%@ is turning left",_model); 
} 
-(void)turnright{ 
    NSLog(@"%@ is turning right",_model); 
} 
-(BOOL) engineStarting{ 
    return true; 
} 

Мой main.m файл выглядит

#import <Foundation/Foundation.h> 
#import "Car.h" 
#import "Car+Maintanance.h" 

int main(int argc, const char * argv[]) { 

    @autoreleasepool { 

     // insert code here... 
     NSLog(@"Hello, World!"); 
     Car *car=[[Car alloc]init]; 
     [email protected]"maruti"; 

     //using car its own methods 
     // i am getting error in this line(no visible @interface......) 
     [car engineStarting]; 
     [car drive]; 
     [car stop]; 
     [car turnleft]; 
     [car turnright]; 

     //using maintainanace 
     if([car neddOilChange]){ 
      [car changeOil]; 
     } 

    } 
    return 0; 
} 
+0

Итак, что ваша цель? 'engineStarting' определяется внутри расширения класса, следовательно, не видимым с внешнего. Вам нужно объявить его в 'Car.h'. –

+0

если я объявляю его в care.h, и он будет общедоступным. Я хочу, чтобы это было приватно –

+0

Что вы хотите сделать? Какова ваша цель? Я думаю, вы должны прочитать о ООП. –

ответ

0

Как вы сказали, что вы создали частный метод -(BOOL) engineStarting, который означает, что вы можете получить доступ к нему только в пределах класса автомобиля. Если вы хотите, чтобы этот метод был видимым в вашем файле main.m, переместите объявление в файл car.h, он сделает его общедоступным.

+0

есть ли способ доступа к частному методу. Если я сделаю так, то это будет открытый не закрытый метод. –

+0

Если вы хотите получить доступ к закрытому методу, он больше не является приватным, а общедоступным. Поэтому поставьте его в базовый интерфейс класса. (Есть способы доступа к приватным методам, но вы не хотите этого делать.) –

+0

@shruthibr вы можете получить доступ к закрытому методу с использованием runtime, но зачем создавать частный метод для доступа к нему позже из внешнего файла? – Greg

0

Вы говорите, что хотите сохранить -engineStarting в частном порядке, но использовать его вне реализации? Это противоречиво, потому что частные средства: «Непостижимо вне реализации».

Возможно, вы перепутались с условиями. И вы правы в пути: нет черной и белой частной/публичной пары, но оттенки серого: что-то может быть видимо только для реализации (обычно называемой private), для реализаций реализации и подкласса (обычно называемых защищенными), для реализации и подкласса, а также классов друзей (в рамках, обычно называемых пакетами) и публичных. Кроме того, у вас может возникнуть желание сделать метод общедоступным только для некоторых подсистем (модулей) и т. Д. Так что это очень сложно.

Что вы можете для этого сделать, это создать отдельную категорию и импортировать заголовок этого файла категории в область, где она должна быть видимой.

//Car_PublicInFrameworkAddition.h 
@interface Car(PublicInFrameworkAddition) 
-(BOOL) engineStarting; 
@end 

//Car_PublicInFrameworkAddition.m 
@implementation Car(PublicInFrameworkAddition) 
-(BOOL) engineStarting 
{ 
… 
} 
@end 

Somewhere.m

// Somewhere should see the addition 
#import "Car_PublicInFrameworkAddition.h" 
+0

как вы его назовете в файле main.m (это была проблема) –

+0

Я добавил образец (Somewhere.m) в конце моего ответа. –

+0

Я сделал это, пожалуйста, посмотрите файл main.m, но все же я получаю ошибку –

Смежные вопросы