2016-12-17 69 views
1

對於這個問題,我想介紹一下我目前的設計和使用特質的想法。我想知道我對特質的理解是否正確,以及我的問題是否可以用不涉及他們的另一種設計來解決。使用PHP特性來模擬多重繼承

在我的框架我目前的類層次結構是這樣的:

interface IPage { /* ... */ } 
interface IForm extends IPage { /* ... */ } 
abstract class AbstractPage implements IPage { /* ... */ } 
abstract class AbstractForm extends AbstractPage implements IForm { /* ... */ } 

在我的應用程序是基於我曾經有過如下的框架:

abstract class AbstractBasePage extends AbstractPage { /* ... */ } 

因此我可以添加一些此框架或其他應用程序不常見的此特定應用程序的所有頁面的更多內容。這一直很好地工作,直到我按照第一個代碼片段的指示實現了頁面和表單的分離。現在,我結束了這樣的事情:

abstract class AbstractBasePage extends AbstractPage { /* ... */ } 
abstract class AbstractBaseForm extends AbstractForm { /* ... */ } 

讓我們在一個應用中承擔應有的每一頁和形式,它指出一些特別的東西是否顯示在模板中的變量。我需要在AbstractBasePageAbstractBaseForm中引入相同的變量。這樣做會迫使我將這兩個片段保持同步,這並不是很好。

我正在考慮創建一個將變量和函數公開給這兩個類的特徵,他們可以在相應的函數中引用它們。至少可以使用這種特性來減少代碼重複,因爲我可以引入一個可以被兩個類調用的公共訪問方法,但除了有一個體面的抽象外,不是嗎?

這是什麼特質應該幫助?有更合適的方法嗎?

回答

1

在這個特殊情況下,我最終引入了一個接口(帶有由框架使用的函數)作爲合約,該合約被IPage擴展。此外,我對特定的頁面和表單中的特定實現進行了處理,然後在框架類AbstractPageAbstractForm中使用。

提到的實現是在框架本身內部有一個簡潔的設計,然後在我的應用程序中使用它。對於應用程序,我引入了一個特徵,它在兩個頁面和表單中再次保存相同的變量和函數,然後在AbstractBasePageAbstractBaseForm類中使用。

對於這種情況,我需要一個本質上是語言輔助的複製和粘貼功能,因爲我想添加一些不太容易用繼承完成的事情,但是可以引入到屬於不同類的一部分的類中層次結構。所以我決定使用特質。