2015-11-03 2 views
0

Привет Я пытаюсь изучить концепцию Opps в Objective C, но я знаю PHP, поэтому я взял программу, в которой для публичной, частной и защищенной упомянутой ниже.public private и protected in object-c

<?php 


//Public properties and method can be inherited and can be accessed outside the class. 
//private properties and method can not be inherited and can not be accessed outside the class. 
//protected properties and method can be inherited but can not be accessed outside the class. 

class one 
{ 
    var $a=20; 
    private $b=30; 
    protected $c=40; 
} 

class two extends one 
{ 

    function disp() 
    { 
     print $this->c; 
     echo "<br>"; 
    } 
} 

$obj2=new two; 
$obj2->disp(); //Inheritance 
echo"<br>"; 

$obj1=new one; 
print $obj1->c; //Outside the class 

?> 

Так что я пытаюсь преобразовать в Objective c code, упомянутый ниже.

#import <Foundation/Foundation.h> 
@interface one : NSObject 
{ 
@private int a; 
@public int b; 
@protected int c; 
} 
@property int a; 
@property int b; 
@property int c; 

@end 
@implementation one 
@synthesize a,b,c; 
int a=10; 
int b=20; 
int c=30; 
@end 

@interface two : one 

-(void)setlocation; 

@end 

@implementation two 

-(void)setlocation; 
{ 
    // NSLog(@"%d",a); 
    NSLog(@"%d",b); 
    // NSLog(@"%d",c); 
} 

@end 
int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     // insert code here... 
     two *newtwo; 
     newtwo =[[two alloc]init]; 
     //calling function 
     [newtwo setlocation];  
    } 
    return 0; 
} 

Когда я запускаю приведенный выше код я получаю

2015-11-03 23:20:16.877 Access Specifier[3562:303] 0 

Может кто-нибудь решить мою проблему.

+0

Вы компилируете это для iOS или OS X? –

+0

Я компилирую это в инструменте командной строки OS X. Просто хочу знать о публичной частной и защищенной концепции. – VyTcdc

ответ

1

Этот тип вопроса было предложено до и есть хорошее объяснение в принятом ответе на Private ivar in @interface or @implementation

В общем, я бы рекомендовал вам избежать переменных экземпляра и использовать @property вместо этого. Свойства имеют преимущество в управлении только для чтения/записи, а также бесплатные синтезированные сеттеры и геттеры (что, если вы изучаете концепции ООП, является важной концепцией, которую вы должны использовать).

Свойства объявляются в частифайла Obj-C. Для контроля доступа (по ссылке) у вас нет открытых/закрытых/защищенных ключевых слов. Все методы Obj-C (и по расширению, свойства) являются общедоступными, если они определены в файле .h. Если вы хотите, чтобы они были «частными», вы определяете их в файле .m с использованием категории классов:

//MyClass.m 
@interface MyClass() 
@property(nonatomic, retain) NSString* myString; 
@end 

@implementation MyClass 
@end 
+0

Прежде всего, благодаря вашему ответу на мой запрос, Ok. Я хочу получить выходное значение 30, но я получаю 0 в этом кодировании, можете ли вы предложить мне, как это сделать. – VyTcdc

+0

Если вы преобразовали свои ivars в свойства, они имеют значение по умолчанию. 'int' будет по умолчанию 0, поэтому вы захотите переопределить конструктор' init', чтобы установить эти значения после того, как ваш класс будет назначен и инициализирован. Сделайте поиск в переполнении стека для Obj-C custom/override init или обратитесь к недавнему учебнику Obj-C или учебному сайту для нюансов, поскольку реализация конструктора Obj-C довольно отличается от PHP. –

+0

Если у вас есть дополнительные вопросы, которые люди не задавали ранее в StackOverflow, не стесняйтесь задавать новый вопрос. –

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