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();

上面是一个注入的例子。请注意,正如托尼霍普金森所说,在这种情况下,您正在调用 dog 实例的方法。如果它们是,你可以调用类上的方法public static,但由于它被标记为 OOP,你真的不应该。PS 示例在 PHP 中。

于 2013-01-23T23:21:58.023 回答
2

超类中定义的方法可以被任何子类访问。但是“姐妹”类不能访问彼此的(私有)方法。

因此,如果您的类CatDog继承自Animal,那么CatDog对象都可以从 调用方法Animal,但它们不能(绝不能)访问彼此的方法。

于 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 是两个不同的类,它们之间没有直接关系。如果我们愿意,我们可以添加一些代码来链接这些类。在此之前,不能从另一个访问其中的成员。

于 2013-02-12T11:59:34.767 回答
0

如果 Cat 没有从 Dog 继承,那么没有

于 2013-01-23T23:17:05.837 回答
0

恐怕……不。Cat大炮调用Dog方法。

继承允许在子类中“查看”父类(public/protected如果您使用 Java)方法,但不能在兄弟类中“查看”。

显然,如果Cat有一个Dogas 属性的实例(我不知道为什么它应该有......)它可以调用publicDog实例的方法。

于 2013-01-24T09:22:32.120 回答
0

在 java 上下文中[我通过 Java 遇到过 OOP]

你不能。

对象可以调用的方法由引用变量决定。

如果您使用 Dog/Cat 引用变量,它只能访问 Dog/Cat 类中的方法(包括继承和覆盖的方法)

如果您使用 Animal(ieParent Class) 作为引用变量并让它引用 Cat/Dog 类对象。您只能使用该引用变量调用子类的继承/覆盖方法。这是在编译时决定的。[如果被调用的 fn 由引用变量标识或否]

Dog 类对象不知道专有的 Cat 类函数[除了继承和覆盖的函数],因此它不能调用这些方法。

正如其他人所指出的,如果你有这样的情况,你可能不会寻找继承。

于 2013-03-05T14:52:28.160 回答