我想在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