我想在C++中設計一個使用FTP,SFTP實現文件傳輸的包裝類。設計一個包裝多種功能的優秀C++包裝類
我有一個基類FileTransfer
(使用curl),它是由派生類FTP
繼承的。我需要支持SFTP,所以我實現了另一個派生類SFTP
,它也繼承自FileTransfer
。
我沿着以下幾行製作了一個包裝類代碼。但是,這看起來不是很好的設計。我對OOP比較陌生,儘管過去我曾在C上工作過。
class Wrapper {
public:
Wrapper(int m_protocol){
protocol = m_protocol;
if (protocol)
pftp = new FTP();
else
psftp = new SFTP();
}
~Wrapper() {
if (protocol)
delete pftp;
else
delete psftp;
}
//Function supported by both ftp/sftp
void do_something(){
if (protocol)
pftp->do_something();
else
psftp->do_something();
}
//FTP specific function
void use_passive(){
assert(protocol);
pftp->use_passive();
}
//SFTP specific function
void ssh_key(){
assert(!protocol);
psftp->ssh_key();
}
private:
int protocol;
FTP *pftp;
SFTP *psftp;
};
我怎樣才能改善這種設計?如何避免每個函數中的if (protocol)
檢查並提高代碼質量?我應該使用void
指針作爲psftp
和'pftp`嗎?
編輯:我使用的包裝,因爲在項目中的很多地方,現有的FTP對象正在使用,如果我使用單獨的類爲SFTP(沒有包裝),我將不得不添加一個if
檢查每次也支持SFTP。我不想將詳細信息(FTP/SFTP)公開給調用者。
你爲什麼使用包裝? – Vincent 2014-11-01 15:47:03
你需要包裝嗎?似乎大多數情況下,您只需要一個'FileTransfer *',它可以是'FTP *'或'SFTP *'。絕對不是*兩個*指針,絕對不是'void *'。 – Barry 2014-11-01 15:47:55
我正在使用一個包裝,因爲在項目中的很多地方,現有的FTP對象正在使用,如果我使用SFTP(沒有包裝)單獨的類,我將不得不添加一個'if'檢查每次也支持SFTP。我想讓呼叫者不知道它是FTP還是SFTP。 – 2014-11-01 15:51:49