OOPの専門家に質問です。 - ページ 35

 
Реter Konow:

階層の深いところにある共通のルートを持つ子孫クラス間のクロスリンクはどのように確立されるのでしょうか?

例えば、こんな感じです。クラスFとクラスZは、階層内の共通のルートであるクラスAを持つ継承の連鎖の末端リンクです。

クラスFからクラスZのデータやメソッドを取得するにはどうすればよいか?

無理でしょう。そんなものはない。しかし、その必要はない。

オブジェクトを作成した 後、あるオブジェクトから2番目のオブジェクトにポインタを渡し、2番目のオブジェクトから1番目のオブジェクトにポインタを渡すことができます。

ただし、クラスについて具体的に話す場合は、コロン2つでどんなオブジェクトでもアドレス指定できます。しかし、何のために必要なのでしょうか?もちろん必要な場合もありますが、極めてマイナーなOOP機能です。

 
Dmitry Fedoseev:

まさかね。そんなものはない。でも、その必要はないんです。

オブジェクトを作成した 後、1つのオブジェクトのポインタを2つ目に、2つ目のオブジェクトのポインタを1つ目に渡すことができます。

ただし、クラスについて具体的に話す場合は、コロン2つで何でも参照できる。しかし、何のために必要なのでしょうか?

Fクラスがどんな課題を解決しているかによりますね。サードパーティの継承チェーンで使用されるデータやメソッドが有用な場面もあるかもしれない。
 

例クラスFにはColorメソッドとLengthメソッド、クラスZにはSoundメソッドとWidthメソッドが格納されています。

長さと幅の2つのプロパティを持つオブジェクトが表示されますが、それらは異なるFとZクラスで計算されています。どうすればいいのか?これらのメソッドの繰り返しを持つ別のクラスを作成するか、またはどのようにそれらにアクセスするのですか?(4つのドットで?)です。

 
Реter Konow:

例クラスFにはColorメソッドとLengthメソッド、クラスZにはSoundメソッドとWidthメソッドが格納されています。

長さと幅の2つのプロパティを持つオブジェクトが表示されますが、それらは異なるFとZクラスで計算されています。どうすればいいのか?これらのメソッドの繰り返しを持つ別のクラスを作成するか、またはどのようにそれらにアクセスするのですか?(4つのドットで?)です。

新しいクラスを作り、その中にFクラスとZクラスを入れればいい。

class F{
};

class Z{
};

class Y{
   public:
   F f;
   Z z;
}
 
Dmitry Fedoseev:

新しいクラスを作成し、その中にクラスFとZを含めることができます。

お辞儀の授業?了解です、ありがとうございます
 
Dmitry Fedoseev:

新しいクラスを作成し、その中にクラスFとZを含めることができます。

あるいは、他のクラスのデータが欲しいクラスの中に、必要なクラスへのポインタを 取得するメソッドを作ることもできます。

 
Реter Konow:
クラスの "お辞儀"?了解です、ありがとうございます

欲しいクラスへのポインタを取得し、そのポインタを使ってクラスオブジェクトを 取得すればいいのです。しかし、空や新しいクラスオブジェクトへのポインタを取得しないように注意する必要があります。

 
Artyom Trishkin:

単純に目的のクラスへのポインタを取得し、そのポインタを用いてクラスオブジェクトを 取得することができます。しかし、空のクラスオブジェクトへのポインタを取得しないように注意する必要があります。

微妙なところなるほど、継承の階層化は、データが明確に分類でき、あらかじめ定義され、曖昧さがない場合に便利なのですね。オブジェクトが複雑になると、クラスでは想定していなかったメソッドやプロパティの組み合わせが登場することがあるため、クラス間のクロスリンクである「バインディング」を構築する必要があるのだ。これは必ずしも便利ではなく、美しい配布方式が崩れ、修正を余儀なくされる可能性があります。
 
Реter Konow:
お辞儀」の授業?なるほど、ありがとうございます。

例では

class F{
};

class Z{
};

class Y{
   public:
   F f;
   Z z;
}

クラスYは、クラスFとクラスZの型を持つ変数を含む。

しかし、すでにFクラスと Zクラスのオブジェクトが どこかで作成され使用されている場合、オブジェクトYでそれらにアクセスすることはできません。オブジェクトYの中にクラスFとZの2つの新しいオブジェクトが存在することになります。

そして、先に作られ、すでに使われているクラスFとZのオブジェクトにアクセスするには、クラスYでオブジェクトFとZへの参照を得る必要があります。そうすれば、クラスYは、新しい原始的なFとZを使うのではなく、すでにFとZに書かれているそれらのデータで操作できるようになります。

しかし、そのようなオブジェクトを作れば、その中のFとZはクラスFとZへのアクセスを与え、クラスYを介してのみそれらを埋める必要があります - 再び、そこからオブジェクトFとZへのアクセスを与え、必要なオブジェクトへのポインタを取得し、ポインタによってそれを操作することができます。

 
Реter Konow:
微妙なところなるほど、継承の階層化は、データが明確に分類でき、あらかじめ定義され、曖昧さがない場合に便利なのですね。オブジェクトが複雑になると、クラスが意図しないメソッドやプロパティの組み合わせが現れることがあり、そのためには「バインディング」、つまりクラス間のクロスリンクの構築が必要になる。これは必ずしも便利ではなく、美しい配布方式が崩れ、修正を余儀なくされる可能性があります。

何も壊す必要はありません。別のクラスの必要なオブジェクトへのポインタを与えるメソッドをクラスに追加すればいいのです。

最近の記事では、この方法で、すでに作成され動作しているシンボル・コレクション・クラスのオブジェクトや、すでにデータが蓄積されている当座預金のオブジェクトへのポインタを、トレード・オブジェクトに渡しています。そして、貿易クラスは、まるで昔から持っていたかのように、それを扱っています。