簡體   English   中英

如何使用抽象 class 而不是自定義組件的接口?

[英]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()LocalDirectoryAdapterDropoxAdapter中是相同的。

原因是因為有一個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\ActiveRecordyii\db\BaseActiveRecord和 yii yii\db\ActiveRecordInterface來查看它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM