1

クラスがある場合は、動物をクラスします。

そして、クラス Dog とクラス Cat の両方が Animal を継承しています。

Cat は Animal 内のメソッドを呼び出すことができます。しかし、Cat は Dog のメソッドを呼び出すことができますか?

4

8 に答える 8

6

あなたの質問への答えは、このように言うことで答えることができます 猫は犬ですか?

これに答えさせてください。

于 2013-01-23T23:23:39.803 に答える
3

いいえ、できませんし、すべきではありません(少なくとも適切な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 です。

于 2013-01-23T23:21:58.023 に答える
2

スーパークラスで定義されたメソッドは、どのサブクラスからもアクセスできます。ただし、「姉妹」クラスは、互いの (プライベート) メソッドにアクセスできません。

したがって、クラスCatDogが から継承されている場合、とオブジェクトAnimalの両方が からメソッドを呼び出すことができますが、互いのメソッドにアクセスすることはできません (してはなりません)。CatDogAnimal

于 2013-01-23T23:22:05.903 に答える
2
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クラス?本当のクラスかどうかを決めるのは誰ですか?

私の要点は、質問は言語の文脈の外では無関係だということです。

于 2013-01-24T00:22:27.720 に答える
1

ここで、cat と dog は 2 つの異なるクラスであり、それらの間に直接的な関係はありません。必要に応じて、これらのクラスをリンクするコードをいくつか追加できます。それまでは、一方のメンバーに他方からアクセスすることはできません。

于 2013-02-12T11:59:34.767 に答える
0

Java コンテキストで [Java 経由で OOP に遭遇しました]

いいえ、あなたがすることはできません。

オブジェクトが呼び出すことができるメソッドは、参照変数によって決まります。

Dog/Cat 参照変数を使用すると、Dog/Cat クラスのメソッドにのみアクセスできます (継承およびオーバーライドされたものを含む)。

Animal(ieParent Class) を参照変数として使用し、Cat/Dog クラス オブジェクトを参照する場合。その参照変数を使用して、サブクラスの継承/オーバーライドされたメソッドのみを呼び出すことができます。これは、コンパイル時に決定されます。[呼び出される fn が参照変数によって識別されるか、または識別されない場合]

Dog クラスのオブジェクトは、Cat クラスの排他的な関数 [継承およびオーバーライドされたもの以外] を認識しないため、メソッドを呼び出すことができません。

他の人が指摘したように、そのようなケースがある場合、継承を探していない可能性があります。

于 2013-03-05T14:52:28.160 に答える
0

残念ながら...いいえ。Cat大砲呼び出しDogメソッド。

継承により、子クラス内で親 (Java を使用している場合はpublic/ ) メソッドを「表示」できますが、兄弟クラス内では表示できません。protected

明らかに、 as プロパティCatのインスタンスがある場合Dog(なぜそれが必要なのかわかりません...) 、そのインスタンスpublicのメソッドを呼び出すことができます。Dog

于 2013-01-24T09:22:32.120 に答える
0

Cat が Dog から継承しない場合は、いいえ

于 2013-01-23T23:17:05.837 に答える