如果我有课,动物课。
我有一个类 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();
上面是一个注入的例子。请注意,正如托尼霍普金森所说,在这种情况下,您正在调用 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 是两个不同的类,它们之间没有直接关系。如果我们愿意,我们可以添加一些代码来链接这些类。在此之前,不能从另一个访问其中的成员。
如果 Cat 没有从 Dog 继承,那么没有
恐怕……不。Cat
大炮调用Dog
方法。
继承允许在子类中“查看”父类(public
/protected
如果您使用 Java)方法,但不能在兄弟类中“查看”。
显然,如果Cat
有一个Dog
as 属性的实例(我不知道为什么它应该有......)它可以调用public
该Dog
实例的方法。
在 java 上下文中[我通过 Java 遇到过 OOP]
你不能。
对象可以调用的方法由引用变量决定。
如果您使用 Dog/Cat 引用变量,它只能访问 Dog/Cat 类中的方法(包括继承和覆盖的方法)
如果您使用 Animal(ieParent Class) 作为引用变量并让它引用 Cat/Dog 类对象。您只能使用该引用变量调用子类的继承/覆盖方法。这是在编译时决定的。[如果被调用的 fn 由引用变量标识或否]
Dog 类对象不知道专有的 Cat 类函数[除了继承和覆盖的函数],因此它不能调用这些方法。
正如其他人所指出的,如果你有这样的情况,你可能不会寻找继承。