簡體   English   中英

C#中多重繼承的解決方法

[英]Workaround for Multiple Inheritance in C#

我必須實現將文件傳輸到USB( class USBTransfer )和通過FTP( class FTPTransfer )的class FTPTransfer 由於這兩個類都使用一些通用方法(例如獲取文件名,讀取一些參數等),因此,我已經在另一個類( class FileOperations )中實現了這些方法。 我繼承了兩個類(即class USBTransferclass FTPTransfer從) class FileOperations

class FileOperations
{
    protected void CommonMethod1();
    protected void CommonMethod2();
}

class USBTransfer : FileOperations
{ 

}

class FTPTransfer : FileOperations
{

}

問題:在文件傳輸操作期間,我設置了不同的狀態(盡管未使用狀態機設計模式)。 我想通過以下結構為此目的使用ABSTRACT類。

abstract class FileTransferStateMachine
{
    //Public
    public enum FileTransferStates { Idle = 0, FileCopyingState = 1, SuccessfullyCopiedState = 2 }
    public static FileTransferStates CurrentState = FileTransferStates.Idle;

    abstract protected void IdleState();
    abstract protected void FileCopyingState();
    abstract protected void SuccessfullyCopiedState();
}

但是在C#中,不允許具有多重繼承。

問題:我知道我可以使用界面。 但是您不能擁有變量,在這種情況下,我的兩個類(即class USBTransferclass FTPTransfer )都將具有以下變量:

public enum FileTransferStates { Idle = 0, FileCopyingState = 1, SuccessfullyCopiedState = 2 }
public static FileTransferStates CurrentState = FileTransferStates.Idle;

我想減少冗余,並希望強制為狀態機使用相同的變量/方法(通過接口可以實現相同的方法)。

問題PART-2:我所提到的文件傳輸到USB或FTP以上,但兩者的傳輸操作有這樣一些常見的狀態IdleStateFileCopyingStateSuccessfullyCopiedState具有其相應的方法(即IdleState() FileCopyingState()SuccessfullyCopiedState() 我想迫使這兩個類來實現這些方法(即IdleState() FileCopyingState()SuccessfullyCopiedState() 如果有任何類忘記實現任何方法,那么我應該得到一個編譯器錯誤。 基本上, FileTransferStateMachine應該是一個接口/抽象類,其方法應在USBTransferFTPTransfer類(它們已經繼承了另一個稱為FileOperations類)中FileOperations

使用組合(並避免使用static成員):

abstract class FileOperations
{
    protected void CommonMethod1();
    protected void CommonMethod2();

    protected FileTransferStateMachine Statemachine { get; set; }
}

編輯,關於第2部分:

當您要強制具體類實現這些方法中的每一個時,接口IFileTransferStateMachine就是正確的。

您還可以從StateMachine派生FileOperations:
abstract class FileOperations: FileTransferStateMachine { }

但是我會使用一個接口,它可以更精細地應用。

解決您說的兩個部分都是問題:

  • 可以將FileTransferStates從類中移出,直接放置在名稱空間中(可能在其自己的文件中)。 然后,兩個實現都可以使用它,而無需重新定義

  • 可以將CurrentState設為非靜態屬性 (非字段)。 可以將屬性放在接口上,因此它們不需要抽象類。 無論如何,強烈建議在公共成員的字段上使用屬性,正如其他人所說的,此處不適合使用static。

正如其他人提到的,另一種選擇是使用這兩個類之一作為依賴項,而不是基類。 即使用合成而不是繼承。

暫無
暫無

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

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