【问题标题】:Can I make a .NET framework class implement an interface that I define?我可以让 .NET 框架类实现我定义的接口吗?
【发布时间】:2009-02-17 23:32:51
【问题描述】:

我想使用一个 .NET 类(为了便于讨论,我们假设为 FileInfo)并让它实现我的接口。例如:

public interface IDeletable
{
    void Delete();
}

注意 FileInfo 确实有 Delete() 方法,所以这个接口可能有意义。

这样我就可以有这样的代码:

FileInfo fileinfo = ...;
DeletObject(fileInfo);

public void DeleteObject(IDeletable deletable)
{
    deletable.Delete();
}

是否可以使现有类与这样的接口匹配?

  • 肖恩

【问题讨论】:

    标签: .net interface


    【解决方案1】:

    不。您需要Adapter pattern。这为您提供了一个实现所需接口的类,并为您“调整”框架类接口。这意味着您的界面设计甚至不必与框架类的界面完全匹配。

    正如 Marc Gravell 在另一个答案中指出的那样,您也许可以作弊并使用 extension methods

    【讨论】:

    【解决方案2】:

    你不能,基本上。不适用于Delete(因为它已经存在),但总的来说:C# 3.0 的一个选项是扩展方法:

    public static void SomeMethod(this FileInfo file)
    { ... your code ... }
    

    现在你可以使用了:

    FileInfo file = ...
    file.SomeMethod();
    

    但是这里没有接口。

    【讨论】:

      【解决方案3】:

      正如@Neil Barnwell 所说,适配器是要走的路。但请注意,接口不应该以这种方式使用,虽然它可能会派上用场,但您至少应该仔细考虑一下。

      看,接口不是双射函数,它们旨在提供一组“规则”,定义对象能够做什么,但是它们应该使用它们的顺序是首先定义它们来描述您的应用程序设计(或您需要的任何东西)然后使用它,而不是相反。或者换句话说,接口在您的应用程序的上下文中定义了一种行为,该行为可能会或可能不会与 .NET 框架的预期用途发生冲突。

      这意味着,对于您“适应”的每个类,您不仅要确保它遵循接口的语法(相同的方法名称,相同的参数),而且还要确保它遵循接口的精神。

      例如,我可以有一个带有 Dispose 方法的类...这并不一定意味着它实现了 IDisposable ...也许不是因为我的 Dispose 方法可以引发异常或阻塞给定时间,所以在履行合同的同时并没有履行精神。

      现在,这也可能发生在您的应用程序中,但由于您知道接口,所以发生这种情况的可能性要小得多,因此您很自然地坚持它的精神......但是 .NET 框架开发人员怎么能做到这一点?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多