【问题标题】:Interfaces in .Net.Net 中的接口
【发布时间】:2011-04-01 23:56:55
【问题描述】:

我想使用相同的代码通过 USB 将文件复制到 FTP 服务器。我已经编写了一些代码,这些代码现在使用来自 System.IO 命名空间的函数。

为了最大程度地减少代码重复,我列出了 system.IO 命名空间中我需要的函数,我正在考虑设计一个暴露类似函数的接口,然后是两个类,一个用于 FTP 文件操作,一个用于本地的。

我有几个关于接口的问题:

  1. 能否设计我的接口,以保留File.*Directory.* 组织(以便接口中声明的例程遵循与IO 命名空间中相同的层次结构)?
  2. 对于本地操作,有没有办法将函数从 IO 命名空间映射到相应的接口函数(写类似Sub IO.File.Delete Implements IOInterface.File_Delete)?
  3. 我可以声明Dim IOHandler As IOInterface 之类的东西,假设IOInterface 是我的接口名称吗?然后我可以同时写IOHandler = New LocalIOHandlerIOHandler = New FTPIOHandler,假设LocalIOHandlerFTPIOHandler 是我的两个类实现IOInterface

谢谢!
CFP。

【问题讨论】:

    标签: .net vb.net class interface io


    【解决方案1】:

    您无法更改现有类以实现您自己的接口。但是,您可以设计自己的接口,让您的方法返回已经存在的类——比如 System.IO 命名空间中的类。

    您还可以实现自己的包装 System.IO 类的类,以便您的 IOInterface.Delete 映射到 FileInfo.Delete(请原谅 C# 语法,我的 VB 生锈了):

    public class MyFileClass : IOInterface
    {
      public void DeleteFile(string fileName) 
      {
         new FileInfo(fileName).Delete();
      }
    }
    

    针对#3: 是的。 IOInterface 类型的变量可以保存实现该接口的任何类型。如果需要,您也可以稍后将其转换为特定类型。

    【讨论】:

    • 虽然不正确,但应避免沮丧并考虑气味。
    • 同意,但有时是必要的,重要的是要知道存储的对象仍然是实现类型,而不仅仅是接口类型。
    • 所以人们一直在告诉我 :) 但他们几乎都没有什么时候的好例子。也就是说,我认为您在这里提到这种可能性是对的,因为 OP 对 oo 来说似乎很新
    【解决方案2】:

    我无法帮助您解决第一个问题,我只是不明白您对函数 hierachi 的意思,而是其他两个。不,没有语法,您必须实现一个将调用转发到该方法的方法。例如。 (伪代码我好多年没写VB了)

    Sub open(path as string)
      Begin
        Return File.Open path
      End
    

    对于你的第三个,你可以说这是接口的一点(它不是唯一一点)消费代码不需要知道具体类型

    【讨论】:

    • 我的意思是,在我的界面中,我将定义需要指定子命名空间、文件和目录,它们将分别保存删除、创建等功能;一个文件或一个目录,就像在 IO 命名空间中所做的那样。
    • 接口驻留在命名空间中,但不能指定声明类所在命名空间的限制。进一步的文件和目录是命名空间 System.IO 中的
    • 那么有没有办法在目录中拥有某种子类?
    • 我不知道你对目录中的子类是什么意思。代码中没有目录(名为 directory 的类除外)。类中可以有类
    • 糟糕,我累了。我的意思是,接口可以声明类和子类吗? (因此实现必须实现两个类,Directory 和 File(那么看起来 System.IO 实现了该接口)
    猜你喜欢
    • 1970-01-01
    • 2016-01-31
    • 2010-09-05
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多