[英]How to use an abstract class instead of an interface for a custom component?
我正在為 Yii2 開發文件管理器模塊,其目標是為用戶提供使用不同來源進行目錄瀏覽的選項,例如
為此,我編寫了一個接口,該接口將由用戶想要使用的不同適配器實現。 例如,這里有幾行代碼來自具有常用功能的接口:
<?php
namespace buttflattery\filemanager\adapters;
/**
* File Manager Interface class
*/
interface DirectoryInterface
{
public function listFolder(string $directory, array $sortParams);
public function removeFile(string $file);
public function createFolder(string $folder, string $parentDirectory);
public function uploadFile(string $file, string $destinationDirectory);
public function downloadFile(string $zipFile);
public function renameFile(string $oldFile, string $newFile);
public function moveFiles(array $filesList, string $destination);
public function copyFiles(array $files, string $destination);
}
我從LocalDirectoryAdapter
開始; 它通過配置文件作為組件附加到模塊中,
'modules' => [
'filemanager' => [
'class' => 'buttflattery\filemanager\Module',
'components' => [
'adapter' => [
'class' => 'buttflattery\filemanager\adapters\local\LocalDirectoryAdapter',
'rootDir' => 'tinyii-uploads'
]
],
],
],
一切正常,直到我開始實施 Dropbox 適配器后遇到了一種情況。
有幾種方法將使用完全相同的代碼。 例如, listFolder()
在LocalDirectoryAdapter
和DropoxAdapter
中是相同的。
原因是因為有一個FileIndexer
組件查詢文件樹並將其寫入 JSON 文件,然后所有的列表和瀏覽都是由FileIndexer
組件通過該 JSON 文件完成的。
那時,我想我需要將接口更改為abstract
class,添加那些常見的方法,並將這些方法保留為抽象,這些方法需要專門針對我正在使用的目錄源實現。 這就是我感到困惑的地方:
LocalDirectoryAdapter
class 被聲明為
class LocalDirectoryAdapter extends Component implements DirectoryInterface{
}
一旦我將接口更改為抽象 class,我就必須使用extend
,在這種情況下,我無法擴展 yii yii\base\Component
class。
我怎樣才能解決這個問題?
您可以讓您的抽象適配器擴展yii\base\Component
,然后通過擴展您的抽象適配器,子 class 也將從 Component 繼承。
例如像這樣
abstract class BaseDirectoryAdapter extends Component
{
}
class LocalDirectoryAdapter extends BaseDirectoryAdapter
{
}
但我認為強制使用抽象基礎 class 並不是一個好習慣。 您不知道將來可能會實現哪些適配器。
您可以做的是同時使用兩者。 該接口將定義適配器和抽象基 class 的最低要求,為常用方法提供標准實現。
interface DirectoryInterface
{
}
abstract class BaseDirectoryAdapter extends Component implements DirectoryInterface
{
}
class LocalDirectoryAdapter extends BaseDirectoryAdapter
{
}
這使您可以從 BaseDirectoryAdapter 中的實現中受益,但不會強迫您使用它。
Yii 使用這種方法,例如,您可以使用 yii yii\db\ActiveRecord
、 yii\db\BaseActiveRecord
和 yii yii\db\ActiveRecordInterface
來查看它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.