嗨我有两个类,例如:ftp1(处理正常的ftp东西),ftp2(处理安全的ftp连接和东西)。基于配置设置,我需要实例化一个类型,该类型可以是这两种类型之一作为类级别变量。这是否可能,如果是这样,有人可以指出我正确的方向。我试图将多态性应用于这种情况,但我对如何做到这一点感到困惑?
答案 0 :(得分:0)
您可以通过使用接口来实现此目的。使用以下代码,您需要使接收方法接受实现iftp的类的实例。
interface iftp {
string address;
int port;
void SomeMethod();
}
class ftp1 : iftp {
void SomeMethod() {
/* implement regular ftp logic */
}
}
class ftp2 : iftp {
void SomeMethod() {
/* implement secure ftp logic */
}
}
答案 1 :(得分:0)
根据具体情况,有两个选项可供我使用,哪些可以使用更改:
ftp1
和ftp2
共享通用功能但以独特方式扩展该功能,则可以使用具有多个实现子类的基类。这样,您可以在程序中拥有其他属性和方法,这些属性和方法需要基类并且可以访问公共属性。
public abstract class FtpBase {
public string ConnectionInformation
public int TimeoutSeconds
}
public class ftp1 : FtpBase {
public void MakeConnectionToFTPServer() {...}
}
public class ftp2 : FtpBase {
public void MakeSecureConnectionToFTPSever() {...}
}
public interface IFtp {
public void MakeConnection()
}
public class ftp1 : IFtp {
public void MakeConnection (){...code to make a regular connection}
}
public class ftp2 : IFtp {
public void MakeConnection (){...code to make a secure connection}
}
//Then you might have in some other code:
public void ConnectViaFtp(IFtp ftp) {
ftp.MakeConnection() // the code doesn't know if this is ftp1 or
// ftp2. All it cares about is calling
// MakeConnection().
}
如果预期两个ftp类具有不同实现的相同功能,我将使用interfaces
。但是,如果每个ftp类只共享一些相同的属性和方法(每个实现中的方法的功能相同),但在两者之间唯一扩展通用功能,则可以使用{{ 1}}。您也可以根据自己的情况使用两者的组合。
答案 2 :(得分:0)
请记住,接口定义了某些内容的作用,而实现定义了它是如何做的。
因此,在您的情况下,定义一个ftp接口,定义您想要的操作 - 登录,获取文件列表,放置文件获取文件,断开连接等。
创建两个实现,一个用于普通ftp,一个用于安全。您可能会发现使用由两个特定衍生产品扩展的一般处理来创建“基础”ftp实现很有用。
所以你有:
ftp接口 - 包含提供的函数的方法声明
baseftp抽象类 - 实现ftp接口,为安全或非安全特定操作调用定义的抽象方法
secureftp具体类 - 实现在baseftp中为安全连接定义的抽象方法
insecureftp具体类 - 实现在baseftp中为非安全连接定义的抽象方法
答案 3 :(得分:0)
如果两个FTP类是第三方框架的一部分(并且尚未实现公共基类),则有两种选择:
将类包装在一个新类中,该类实现一个公共基类或接口
//Interface for original library classes.
public someClass {
public void DoSomething();
}
public someClass2 {
public void DoSomething();
}
//Wrapper implementation
public wrappedSomeClass : baseSomeClass {
private someClass mSomeClass;
public wrappedSomeClass() {
mSomeClass = new someClass();
}
//DoSomething will need to be defined in baseSomeClass
public overrides void DoSomething() {
mSomeClass.DoSomething();
}
}
public wrappedSomeClass2 : baseSomeClass {
private someClass2 mSomeClass2;
public wrappedSomeClass2() {
mSomeClass2 = new someClass2();
}
//DoSomething will need to be defined in baseSomeClass
public overrides void DoSomething() {
mSomeClass2.DoSomething();
}
}
写入包装器后,使用包装器类编写新代码。
将值存储在Object
object
数据类型是所有类的公共基础。你的代码看起来像这样:
public someclass {
private object myVariable;
private void somemethod() {
if(something) {
myVariable = new something();
} else {
myvariable = new something2();
}
}
}
当您使用变量的值时,您几乎总是需要将其转换回原始类型。
if(something) {
((something)myVariable).InvokeMethod();
} else {
((something2)myVariable).InvokeMethod();
}
答案 4 :(得分:0)
也许您可以实施Factory Mehod Patther或简单的策略方法之一。 PLase在
处查看此代码示例希望这可以帮助您实现目标。
问候