2017-03-16 67 views
0

我必須實現類將文件傳輸到USB(class USBTransfer)和通過FTP(class FTPTransfer)。因爲這兩個類都使用了一些常用的方法(如獲取文件名,讀取一些參數等),所以我在另一個類中實現了這些方法(class FileOperations)。我繼承了class FileOperations這兩個類(即class USBTransferclass FTPTransfer)。在C#中的多繼承的解決方法

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:我上面提到的,但無論是傳輸操作有像IdleStateFileCopyingStateSuccessfullyCopiedState一些常見的狀態具有其相應的方法(即IdleState()FileCopyingState()SuccessfullyCopiedState())文件傳輸到USB或FTP 。我想要實現這些方法的兩個類(即IdleState(),FileCopyingState()SuccessfullyCopiedState())。如果任何類忘記實現任何方法,那麼我應該得到一個編譯器錯誤。基本上,FileTransferStateMachine應該是一個接口/抽象類,它的方法應該在USBTransferFTPTransfer類(它們已經繼承另一個稱爲FileOperations的類)中被覆蓋。

+3

爲什麼在這裏使用'static'?另外爲什麼'FileTransferStates'是一個嵌套類型?刪除這些東西,並將它變成一個界面,在層次結構鏈中添加另一層。 – Igor

+0

'FileTransferStates'是'static',因爲這個變量是在另一個類中讀取的,並且聲明它是靜態的,所以我不需要有一個對象來訪問另一個類中的變量。 – skm

+4

「...是靜態的,因爲這個變量是在另一個類中讀取的」:ouch。 –

回答

3

使用的組合物(和避免static狀態成員):

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

    protected FileTransferStateMachine Statemachine { get; set; } 
} 

編輯,關於第2部分:

當你想強制的具體類來實現每個這樣的方法,那麼接口IFileTransferStateMachine是完全正確的。

你也可以得到FileOperations從的StateMachine:
abstract class FileOperations: FileTransferStateMachine { }

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

+0

如果我將'FileTransferStateMachine Statemachine'聲明爲受保護的(而不是靜態的),那麼如何在另一個類中讀取此變量的值(該類正在讀取值併發布有關狀態的相應消息)。 – skm

+0

「受保護」級別只是我的猜測,使其公開。但是你不應該需要'static',並且當兩個文件操作同時運行時你不能使用它。 –

+0

謝謝,大家都說這裏不應該使用'static'。請您在這種情況下添加一些關於使用'static'的負面影響的觀點。 – skm

0

解決這兩個你說的部分是一個問題:

  • FileTransferStates可以移出類,直接在命名空間中放置的(可能是在它自己的文件)。然後,它可以通過兩個實現而不被重新定義

  • CurrentState可以由非靜態屬性(未字段)被使用。屬性可以放在一個接口上,所以它們不需要抽象類。無論如何都強烈建議公共會員的屬性,正如其他人所說的那樣,靜態在這裏是不合適的。

正如其他人所說的,另一種選擇是使用這兩個類中的一個作爲依賴而不是基類。即使用組合而不是繼承。