2013-01-23 2 views
1

Если у меня есть класс, класс Animal.OOP - Inheritance

И у меня есть класс Dog и класс Cat как наследующий Animal.

Cat может вызывать методы внутри животных. Но могут ли кошки вызвать методы собаки?

+1

@DWright, http://en.wikipedia.org/wiki/Friend_class;) – Fivell

+0

Таким образом, это не сработает, если вы явно не выполняете 'friend class Dog'? – 40Plot

+1

@Fivell: точно. – DWright

ответ

2

Методы, определенные в суперклассе, доступны для любого подкласса. Но классы «сестра» не могут получить доступ к (приватным) методам друг друга.

Так что, если ваши классы Cat и Dog наследования от Animal, то оба Cat и Dog объектов могут вызывать методы из Animal, но они не могут (не должны) доступ к методам друг друга.

0

Если кошка не наследует от собаки, то не

3

Нет, это не может и не должно нет (по крайней мере, когда речь идет о правильной ООП). Если кошке действительно нужна собака (по какой бы то ни было больной причине), вы должны ввести собаку в кошку. Если вы считаете, что вам это нужно, у вас, вероятно, есть неправильное наследование/абстракция.

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

Выше приведен пример инъекции. Обратите внимание, что, поскольку Тони Хопкинсон заявил, что вы вызываете методы на примере собаки в этом случае. Вы можете вызывать методы в классе, если они public static, но поскольку он помечен OOP, вы действительно не должны этого делать. Постскриптум Например, в PHP.

+0

Можете ли вы объяснить, что вы подразумеваете под «инъекцией»? – Barranka

+2

Если вы передали собаку собаке кошке. Кошка все равно не будет называть собачьи методы, они будут вызваны на собаку, в которой вы проходили. –

+0

@ Тони Хопкинсон справедливая точка – PeeHaa

4

Ответ на ваш вопрос можно ответить, указав его так: Является ли кошка собакой?

Я позволю вам ответить на этот вопрос.

+1

+1 - Я часто нахожу, что вопросы о вопросах могут быть легко решены при обрамлении в терминах (английского) языка. Классический пример: «есть» или «имеет». – PeteH

+0

Это первый вопрос, который вы должны задать. Вслед за этим рядом с вами вы спрашиваете последнее: «Кошка все еще кошка? –

+0

Говоря о доменных терминах и их отношениях на естественном языке, это то, о чем придумал ООП! – Desty

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? классы python, такие как Java? кто решает, что такое настоящий класс или нет?

Моя точка зрения не имеет значения вне языкового контекста.

0

Боюсь, что ... нет. Cat пушки вызова Dog методов.

Inheritance позволяет «просматривать» родителей (public/protected, если вы используете Java) методы внутри дочерних классов, но не внутри классов сестер.

Obviosly если Cat имеет экземпляр Dog как собственность (я не знаю, почему это должно быть ...) можно назвать public методы этого Dog экземпляра.

1

Здесь кошка и собака представляют собой два разных класса, и между ними нет прямой связи. Если мы хотим, чтобы мы могли добавить несколько кодов для соединения этих классов. До тех пор ни у кого из членов не может быть доступ к другому.

0

В контексте Java [я сталкивался Упс с помощью Java]

Нет, вы не можете.

Методы, которые могут быть вызваны объектом, определяются ссылочной переменной.

При использовании собак/ссылка Cat переменная может только методы доступа в Dog/Cat класса (включая унаследованные и подменены из них)

При использовании животных (ieParent Class) в качестве контрольной переменной и иметь его см к объекту класса Cat/Dog. Вы можете только называть унаследованные/переопределенные методы подкласса, используя эту ссылочную переменную. Это определяется во время компиляции. [Если вызываемый fn идентифицируется ссылочной переменной или нет]

Объект класса Dog не знает об исключительных Функции класса Cat [кроме унаследованных и переопределенных], поэтому он не может вызвать методы.

Как указано другими, если у вас есть случай как таковой, вы не можете искать наследование.