[英]Workaround for Multiple Inheritance in C#
我必須實現將文件傳輸到USB( class USBTransfer
)和通過FTP( class FTPTransfer
)的class FTPTransfer
。 由於這兩個類都使用一些通用方法(例如獲取文件名,讀取一些參數等),因此,我已經在另一個類( class FileOperations
)中實現了這些方法。 我繼承了兩個類(即class USBTransfer
和class 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 USBTransfer
和class FTPTransfer
)都將具有以下變量:
public enum FileTransferStates { Idle = 0, FileCopyingState = 1, SuccessfullyCopiedState = 2 }
public static FileTransferStates CurrentState = FileTransferStates.Idle;
我想減少冗余,並希望強制為狀態機使用相同的變量/方法(通過接口可以實現相同的方法)。
問題PART-2:我所提到的文件傳輸到USB或FTP以上,但兩者的傳輸操作有這樣一些常見的狀態IdleState
, FileCopyingState
或SuccessfullyCopiedState
具有其相應的方法(即IdleState()
FileCopyingState()
或SuccessfullyCopiedState()
。 我想迫使這兩個類來實現這些方法(即IdleState()
FileCopyingState()
或SuccessfullyCopiedState()
如果有任何類忘記實現任何方法,那么我應該得到一個編譯器錯誤。 基本上, FileTransferStateMachine
應該是一個接口/抽象類,其方法應在USBTransfer
和FTPTransfer
類(它們已經繼承了另一個稱為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.