クラスがある場合は、動物をクラスします。
そして、クラス Dog とクラス Cat の両方が Animal を継承しています。
Cat は Animal 内のメソッドを呼び出すことができます。しかし、Cat は Dog のメソッドを呼び出すことができますか?
あなたの質問への答えは、このように言うことで答えることができます 猫は犬ですか?
これに答えさせてください。
いいえ、できませんし、すべきではありません(少なくとも適切なOOPについて話しているときはそうではありません)。猫が(何らかの病気の理由で)本当に犬を必要とする場合は、猫に犬を注射する必要があります. それが必要だと思うなら、おそらく間違った継承/抽象化を持っています。
class Animal
{
public annoy();
}
class Cat extends Animal
{
private $dog;
public function __construct(Dog $dog)
{
$this->dog = $dog;
}
public function annoyDog()
{
$this->dog->annoy();
}
}
class Dog extends Animal
{
}
$dog = new Dog();
$cat = new Cat($dog);
$cat->annoyDog();
上記はインジェクションの例です。Tony Hopkinson が述べたように、この場合は dog のインスタンスでメソッドを呼び出していることに注意してください。である場合は、クラスのメソッドを呼び出すことができますがpublic static
、OOP のタグが付けられているため、実際にはすべきではありません。PS の例は PHP です。
スーパークラスで定義されたメソッドは、どのサブクラスからもアクセスできます。ただし、「姉妹」クラスは、互いの (プライベート) メソッドにアクセスできません。
したがって、クラスCat
とDog
が から継承されている場合、とオブジェクトAnimal
の両方が からメソッドを呼び出すことができますが、互いのメソッドにアクセスすることはできません (してはなりません)。Cat
Dog
Animal
If I have a class, class Animal.
And I have a class Dog and a class Cat both inheriting Animal.
Cat can call methods inside Animal. But can Cat call methods of Dog?
javascript では、はい、書きやすいので coffeescript を使用します。
class Animal
bark:-> "i'm an animal"
class Dog extends Animal
eatBone : -> "i'm eating a bone"
class Cat extends Animal
cat = new Cat
alert Dog::eatBone.call cat
それは理にかなっていますか?おそらくそうではありませんが、javascript では、プロトタイプのメソッドはオブジェクトにバインドされません (クロージャーで強制しない限り)。ここで、javascript には java のようなクラスはないと主張できますが、C++ クラスは Java のようなクラスですか? Javaクラスのようなpythonクラス?本当のクラスかどうかを決めるのは誰ですか?
私の要点は、質問は言語の文脈の外では無関係だということです。
ここで、cat と dog は 2 つの異なるクラスであり、それらの間に直接的な関係はありません。必要に応じて、これらのクラスをリンクするコードをいくつか追加できます。それまでは、一方のメンバーに他方からアクセスすることはできません。
Java コンテキストで [Java 経由で OOP に遭遇しました]
いいえ、あなたがすることはできません。
オブジェクトが呼び出すことができるメソッドは、参照変数によって決まります。
Dog/Cat 参照変数を使用すると、Dog/Cat クラスのメソッドにのみアクセスできます (継承およびオーバーライドされたものを含む)。
Animal(ieParent Class) を参照変数として使用し、Cat/Dog クラス オブジェクトを参照する場合。その参照変数を使用して、サブクラスの継承/オーバーライドされたメソッドのみを呼び出すことができます。これは、コンパイル時に決定されます。[呼び出される fn が参照変数によって識別されるか、または識別されない場合]
Dog クラスのオブジェクトは、Cat クラスの排他的な関数 [継承およびオーバーライドされたもの以外] を認識しないため、メソッドを呼び出すことができません。
他の人が指摘したように、そのようなケースがある場合、継承を探していない可能性があります。
残念ながら...いいえ。Cat
大砲呼び出しDog
メソッド。
継承により、子クラス内で親 (Java を使用している場合はpublic
/ ) メソッドを「表示」できますが、兄弟クラス内では表示できません。protected
明らかに、 as プロパティCat
のインスタンスがある場合Dog
(なぜそれが必要なのかわかりません...) 、そのインスタンスpublic
のメソッドを呼び出すことができます。Dog
Cat が Dog から継承しない場合は、いいえ