2009-02-17 1 views
3

Я хочу взять .NET-класс (скажем, FileInfo для обсуждения) и реализовать его интерфейс. Например:Могу ли я создать класс .NET framework для реализации интерфейса, который я определяю?

public interface IDeletable 
{ 
    void Delete(); 
} 

Обратите внимание, что FileInfo действительно есть метод Delete(), так что этот интерфейс может иметь смысл.

Так что я могу иметь такой код:

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

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

Можно ли сделать существующий класс матч это интерфейс, как это?

  • Шон

ответ

5

Неа. Вам нужен Adapter pattern. Это дает вам класс, который реализует необходимый интерфейс и «адаптирует» интерфейс класса framework для вас. Это означает, что дизайн интерфейса даже не обязательно должен точно соответствовать интерфейсу класса framework.

Как отмечает Марк Гравелл в другом ответе, вы можете обмануть и использовать extension methods.

+0

Было бы неплохо, если бы был инструмент для автоматизации этого. http://stackoverflow.com/questions/5035188/net-tools-extract-interface-and-implement-wrapper-class/5035800#5035800 – 2011-02-18 00:13:19

2

Вы не можете, в основном. Не для Delete (так как он уже существует), но в целом: один вариант с C# 3.0 это методы расширения:

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

Теперь вы можете использовать:

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

Но нет никакого интерфейса здесь.

1

Как @Neil Barnwell сказал, адаптер - это путь. Но будьте осторожны, интерфейсы не должны использоваться таким образом, и хотя это может пригодиться, вы должны по крайней мере тщательно обдумать это.

См. Интерфейс не являются биективными функциями, они предназначены для предоставления набора «правил», определяющих, что объект способен делать «да», но порядок, в котором они должны использовать, - это сначала определить их описать дизайн вашего приложения (или что вам нужно), а затем использовать его, а не наоборот. Или, другими словами, интерфейс определяет поведение в контексте ВАШЕ приложения, которое могло бы или не могло бы совпадать с предполагаемым использованием платформы .NET.

Это означает, что для каждого класса, который вы «адаптируете», вы должны убедиться не только в том, что он следует за синтаксисом интерфейса (то же имя метода, что и у параметров) , но также и в том, что он следует духу интерфейса.

Например, у меня может быть класс с методом Dispose ... это не обязательно означает, что он реализует IDisposable ... возможно, это не потому, что мой метод Dispose может создавать исключение или блокировать учитывая время, поэтому, выполняя контракт, он не выполняет дух.

Теперь это может случиться и в вашем приложении, но гораздо менее вероятно, потому что вы знаете интерфейс, поэтому вполне естественно, что вы придерживаетесь его духа ... но как мог разработчик .NET framework сделать одна и та же?