我想要一个.NET类(为了讨论而让我们说FileInfo)并让它实现我的接口。例如:
public interface IDeletable
{
void Delete();
}
请注意,FileInfo DOES具有Delete()方法,因此该接口可能有意义。
这样我就可以拥有这样的代码:
FileInfo fileinfo = ...;
DeletObject(fileInfo);
public void DeleteObject(IDeletable deletable)
{
deletable.Delete();
}
是否可以使现有的类匹配这样的接口?
答案 0 :(得分:5)
不。你需要Adapter pattern。这为您提供了一个实现所需接口的类,并为您“适应”框架类接口。这意味着您的界面设计甚至不必与框架类的界面完全匹配。
正如Marc Gravell在另一个答案中指出的那样,你可能会欺骗并使用extension methods。
答案 1 :(得分:2)
Delete
(因为它已经存在),但一般来说:C#3.0的一个选项是扩展方法:
public static void SomeMethod(this FileInfo file)
{ ... your code ... }
现在你可以使用:
FileInfo file = ...
file.SomeMethod();
但这里没有界面。
答案 2 :(得分:1)
正如@Neil Barnwell所说,适配器是要走的路。但要注意,接口不应该以这种方式使用,虽然它可能会派上用场,但至少应该仔细考虑它。
参见,接口不是双射函数,它们旨在提供一组定义对象能够做什么的“规则”,但它们应该使用它们的顺序是首先定义它们来描述您的应用程序设计(或任何您需要的)然后使用它,而不是相反。或者换句话说,接口在您的应用程序的上下文中定义了一个行为,该行为可能会也可能不会与.NET框架的预期用途发生冲突。
这意味着,对于你“适应”的每个类,你必须确保它不仅遵循接口的语法(相同的方法名称,相同的参数),而且它还遵循接口的精神。 强>
例如,我可以有一个带有Dispose方法的类......这并不一定意味着它实现了IDisposable ...也许它不会因为我的Dispose方法可以引发异常,或者阻塞给定时间,所以在履行合同时,它不符合精神。
现在,这也可能发生在您的应用程序中,但由于您了解界面,因此更不可能发生,因此您很自然地坚持其精神......但.NET框架开发人员如何做同样的事情?