Now I have Class B variables which I also need to use in Class A. And
also one another Class C, Class A add in Class C (not inherits), and I
want to use Class B variables in Class C.
How can I access?
Risposta breve: No, non puoi fare ciò che proponi.
Spiegazione più dettagliata e dettagliata:
Le classi non hanno variabili - gli oggetti lo fanno. Si chiamano variabili di istanza (o ivars in breve) perché sono variabili associate a una istanza di una classe, che è dire un oggetto. Dichiarate le variabili nella dichiarazione di classe, ovviamente, ma non vengono effettivamente create finché la classe non è istanziata , cioè finché un'istanza (un oggetto) di la classe è stata creata.
Quindi, se hai questo:
ClassA *objectA = [[ClassA alloc] init];
ClassB *objectB = [[ClassB alloc] init];
then objectA
è un'istanza di ClassA e objectB
è un'istanza di ClassB. Stabiliamo anche (come hai nella tua domanda) che ClassB è una sottoclasse di ClassA. Cioè, è dichiarato come:
@interface ClassA : NSObject
{
int foo;
}
@interface ClassB : ClassA
{
int bar;
}
Quindi per ottenere la tua domanda ... objectA
ha una variabile di istanza chiamata foo
, più qualsiasi che erediti da NSObject. objectB
ha una variabile di istanza denominata bar
e inoltre eredita foo
da ClassA e qualsiasi altra classe ottenuta da NSObject. objectA
fa non ha un ivar chiamato bar
, e provare ad accedervi causerebbe un errore:
objectA->foo = 1; // OK
objectB->foo = 2; // OK
objectA->bar = 3; // Error!
objectB->bar = 4; // OK
Questo perché ogni istanza di ClassB è anche un'istanza di ClassA (questo è l'effetto dell'ereditarietà) ma un'istanza di ClassA non è necessariamente un'istanza di ClassB. Va bene per il codice in ClassA fare riferimento a variabili o proprietà in ClassB, ma solo se sa che si tratta di un'istanza di ClassB. Quindi potresti avere un metodo come:
- (void)addBar:(ClassB*)someB
{
foo += someB->bar;
}
Va bene perché sai che someB
dovrebbe essere un'istanza di ClassB. Quello che non puoi fare in ClassA è:
- (void)addBar:(ClassB*)someB
{
bar += someB->bar; // Error! ClassA doesn't have a 'bar' ivar!
}
perché, ancora una volta, ClassA non ha un ivar chiamato bar
.
A proposito, anche il primo esempio non è una grande forma - a meno che non ci sia una buona ragione, è meglio evitare la situazione in cui una classe (come ClassA) dipende dalla sua sottoclasse (come ClassB).