web-dev-qa-db-ja.com

親クラスで子クラス変数を使用できますか?

私はObjective C、iOSでプログラミングしています。親クラスであるClass Aを作成し、Class BClass Aに継承します。

これでClass B変数ができました。これもClass Aで使用する必要があります。また、もう1つClass CClass AClass Cに追加され(継承されません)、Class B変数をClass Cで使用したいと思います。

どうすればアクセスできますか?私もオブジェクトを作成しましたが、機能していません。アクセスできますか?

3
Solid Soft

これで、クラス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など)に依存している状況を回避することをお勧めします。

6
Caleb

ClassBの変数をClassAに移動することは可能ですか?

そうでない場合は、ClassAが変数を使用できるように、ClassBが実装する必要のある純粋仮想関数/インターフェースのObj-C相当物をClassAに追加できます。次に、ClassCもこのインターフェイスを介してそれらにアクセスできます。

2
James

短い答え:

親クラスはその子にまったく気づいていないので、それはできません。

0