Posso usare variabili di classe child nella sua classe genitore?

3

Sto programmando in Objective C, iOS. Creo un Class A che è una classe genitore e Class B eredita Class A .

Ora ho Class B variabili che devo anche usare in Class A . E anche l'altro Class C , Class A add in Class C (non ereditato), e voglio usare Class B variabili in Class C .

Come posso accedere? Ho creato anche l'oggetto ma non funziona, è possibile accedere?

    
posta Solid Soft 07.06.2012 - 13:28
fonte

3 risposte

6

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).

    
risposta data 07.06.2012 - 15:08
fonte
2

È possibile spostare le variabili di ClassB in ClassA?

Se così non fosse, forse potresti aggiungere qualsiasi cosa l'equivalente Obj-C di pura funzioni / interfaccia virtuali sia a ClassA, che ClassB deve implementare, in modo che ClassA possa usare le variabili. Quindi ClassC potrebbe anche accedervi tramite questa interfaccia.

    
risposta data 07.06.2012 - 13:58
fonte
0

Risposta breve:

Questo non può essere fatto perché le classi genitore sono totalmente ignare dei suoi figli.

    
risposta data 03.10.2012 - 16:01
fonte

Leggi altre domande sui tag