我如何将两个类变为一个

时间:2010-08-05 14:57:30

标签: polymorphism

嗨我有两个类,例如:ftp1(处理正常的ftp东西),ftp2(处理安全的ftp连接和东西)。基于配置设置,我需要实例化一个类型,该类型可以是这两种类型之一作为类级别变量。这是否可能,如果是这样,有人可以指出我正确的方向。我试图将多态性应用于这种情况,但我对如何做到这一点感到困惑?

5 个答案:

答案 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)

根据具体情况,有两个选项可供我使用,哪些可以使用更改:

  • 具有InheritedClassess的BaseClass
    • 如果ftp1ftp2共享通用功能但以独特方式扩展该功能,则可以使用具有多个实现子类的基类。这样,您可以在程序中拥有其他属性和方法,这些属性和方法需要基类并且可以访问公共属性。

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在

处查看此代码示例

Factory Method Pattern

Strategy Pattern

希望这可以帮助您实现目标。

问候