2012-10-25 62 views
2

比方說,我有2個班如何只擴展一個父項?

class BaseClass { 
    ... 
} 

class SomeClass extends BaseClass { 

} 

現在我想創建第三類,這隻會延長SomeClass的,而不是從BaseClass的得到任何東西。這甚至有可能嗎?

我正在寫與webdriver的Selenium測試,並希望從對數據庫或Web服務硒檢查數據,但不希望加載整個框架,只是一些我們的圖書館

+1

你能澄清一下「不想加載整個框架,只是我們的一些庫」,因爲它聽起來像你的繼承圖被破壞了。 – Gordon

+0

基於類的包含(可能是你正在尋找的)可能與[*特性*](http://php.net/traits)。不知道你的情況是否合理,但是你直接尋找的東西在PHP中不存在。 – hakre

回答

6

你不能的。這不是繼承的工作原理。從SomeClass繼承的類將始終繼承它的所有屬性和方法,包括繼承自BaseClass的SomeClass。您可以通過可見性來限制他們的訪問權限,但只能從私密保護到公共,而不是其他方式。你可以放鬆能見度,但不能擰緊它。

查看關於繼承和知名度PHP手冊中的章節:


另一種選擇是使用某種門面的周圍的一個實例SomeClass控制對SomeClass中可訪問的屬性和方法的訪問,例如假設你有SomeClass的從BaseClass的一個方法foo(),並繼承了吧(),你可以做

class LimitedAccess 
{ 
    private $instance; 

    public function __construct(SomeClass $someClass) 
    { 
      $this->instance = $someClass 
    } 

    public function foo() 
    { 
     return $this->instance->foo; 
    } 
} 

,然後你可以通過漏斗這個門面有效地阻止訪問的BaseClass ::巴所有訪問()。請注意,這不會以任何方式更改繼承層次結構。它只是控制訪問。

+0

我知道繼承是如何工作的,只是希望會有一些辦法阻止繼承:) 感謝名單反正 –

2

想想爲人類...... 你的母親和她的母親...... 你不能是你母親的兒子沒有被你奶奶的孫子..

同樣是在PHP

當類擴展其他的跳投他的孩子......

0

你絕對可以做,如果你把方法的PROTECTED訪問修飾符中要被限制在從Third類稱爲BaseClass ..

+1

但是,這也將限制SomeClass的訪問這些方法,這是不是我所需要 –

+0

@TomasJancik:不,它不會因爲你的SomeClass已經繼承了BaseClass,它滿足訪問Protected修飾符前綴函數的標準。 –

+0

@RahulRanjan在Base中保護的任何東西都將在子類中保護,因此Foo擴展Bar擴展Base將擁有Base的所有受保護成員。 – Gordon

相關問題