2013-01-23 101 views
1

如果我有一個類,動物類。面向對象 - 繼承

而且我有一類狗和一類貓都繼承了動物。

貓可以調用動物內的方法。但貓可以調用狗的方法嗎?

+1

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

+0

所以,除非你明確地做'friend class Dog',否則它不會工作? – 40Plot

+1

@Fivell:確切地說。 – DWright

回答

2

在超類中定義的方法可以訪問任何子類。但是「姐妹」班不能訪問彼此的(私人)方法。

所以,如果你的類CatAnimalDog繼承,那麼這兩個CatDog對象可以調用方法從Animal,但他們不能(不得)訪問對方的方法。

0

如果貓不從狗則沒有

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

上面是一個注射的例子。請注意,正如託尼霍普金森所說,在這種情況下,您正在調用狗實例的方法。如果他們是public static,你可以調用這個類的方法,但是因爲它被標記爲OOP,你真的不應該這樣做。附:例子是在PHP中。

+0

你能解釋一下「注入」是什麼意思嗎? – Barranka

+2

如果你通過狗貓的貓。貓仍然不會叫狗的方法,他們會被通過你的狗叫。 –

+0

@TonyHopkinson公平點 – PeeHaa

4

對此問題的回答可以通過如下方式回答 貓是狗嗎?

我會讓你回答這個問題。

+1

+1 - 我經常發現,當用(英語)語言框定時,oo問題可以很容易地解決。一個典型的例子是「是一個」與「有一個」。 – PeteH

+0

這是你應該問的第一個問題。緊接着你問最近的親戚,貓還是貓嗎? –

+0

說到領域術語及其在自然語言中的關係,那就是OOP的發明! – 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那樣的類,但是像Java那樣的C++類? Python類像Java的?誰決定什麼是真正的課堂?

我的觀點是這個問題在語言環境之外是無關緊要的。

0

恐怕沒有。 Cat大炮調用Dog方法。

繼承允許在子類中但不在兄弟類內「查看」父母(如果您使用Java,則爲「public/protected」)方法。

Obviosly如果CatDog財產的情況下(我不知道爲什麼它應該有......),它可以調用Dog實例public方法。

1

這裏貓和狗是兩個不同的類,它們之間沒有直接的關係。如果我們希望我們可以添加幾個代碼來鏈接這些類。在此之前,一個成員不能從另一個訪問。

0

在java的情況下[我遇到過Java的OOP]

不,你不能。

可由對象調用的方法由引用變量確定。

如果使用狗/貓引用變量只能在狗/貓類(包括繼承和重寫的)訪問方法

如果使用動物(ieParent類)作爲參考變量,並將它指到一個Cat/Dog類對象。您只能使用該參考變量調用子類的繼承/重寫方法。這是在編譯時決定的[如果被調用的函數被參考變量或否定]

Dog類對象不知道獨佔Cat類函數[繼承和重寫的函數除外],所以它不能調用方法。

正如其他人所指出的,如果你有這樣的情況,你可能不會尋找繼承。