私はObjective C、iOSでプログラミングしています。親クラスであるClass A
を作成し、Class B
はClass A
に継承します。
これでClass B
変数ができました。これもClass A
で使用する必要があります。また、もう1つClass C
、Class A
がClass C
に追加され(継承されません)、Class B
変数をClass C
で使用したいと思います。
どうすればアクセスできますか?私もオブジェクトを作成しましたが、機能していません。アクセスできますか?
これで、クラスAで使用する必要があるクラスB変数ができました。また、クラスC、クラスAがクラスCに追加され(継承ではありません)、クラスB変数をクラスCで使用したいと思います。
どうすればアクセスできますか?
短い答え:いいえ、提案したことはできません。
長く、より詳細な説明:クラスには変数がありません-オブジェクトにはあります。これらはインスタンス変数(またはivarsの略)と呼ばれます。これは、クラスのインスタンス、つまりオブジェクトです。もちろん、クラス宣言で変数を宣言しますが、変数が実際に作成されるのは、クラスがインスタンス化されるまで、つまりインスタンスまでですクラスの(オブジェクト)が作成されます。
したがって、これがある場合:
ClassA *objectA = [[ClassA alloc] init];
ClassB *objectB = [[ClassB alloc] init];
次に、objectA
はClassAのインスタンスであり、objectB
はClassBのインスタンスです。 ClassBがClassAのサブクラスであることも(あなたの質問にあるように)規定しましょう。つまり、次のように宣言されています。
@interface ClassA : NSObject
{
int foo;
}
@interface ClassB : ClassA
{
int bar;
}
だからあなたの質問に行くために... objectA
にはfoo
と呼ばれるインスタンス変数があり、それにNSObjectから継承したものがあります。 objectB
にはbar
というインスタンス変数があり、ClassAからfoo
を継承し、ClassObjectはNSObjectから取得します。 objectA
にはbar
というivarがないので、それにアクセスしようとするとエラーが発生します。
objectA->foo = 1; // OK
objectB->foo = 2; // OK
objectA->bar = 3; // Error!
objectB->bar = 4; // OK
これは、ClassBのインスタンスはClassAのインスタンスでもある(継承の影響)が、ClassAのインスタンスが必ずしもClassBのインスタンスであるとは限らないためです。 ClassAのコードがClassBの変数またはプロパティを参照しても問題ありませんが、ClassBのインスタンスを処理していることがわかっている場合に限ります。だからあなたは次のような方法を持つことができます:
- (void)addBar:(ClassB*)someB
{
foo += someB->bar;
}
someB
がClassBのインスタンスであることがわかっているため、これで問題ありません。 ClassAで実行できないことは次のとおりです。
- (void)addBar:(ClassB*)someB
{
bar += someB->bar; // Error! ClassA doesn't have a 'bar' ivar!
}
これも、ClassAにはbar
という名前のivarがないためです。
ちなみに、最初の例でも優れた形式ではありません。正当な理由がない限り、クラス(ClassAなど)が独自のサブクラス(ClassBなど)に依存している状況を回避することをお勧めします。
ClassBの変数をClassAに移動することは可能ですか?
そうでない場合は、ClassAが変数を使用できるように、ClassBが実装する必要のある純粋仮想関数/インターフェースのObj-C相当物をClassAに追加できます。次に、ClassCもこのインターフェイスを介してそれらにアクセスできます。
短い答え:
親クラスはその子にまったく気づいていないので、それはできません。