C# и интерфейсы-явный и неявный

В C#, если класс имеет все правильные методы / подписи для интерфейса, а не явно реализовать его как:

class foo : IDoo {}

может еще быть приведен в качестве интерфейса?

5 ответов


нет, это не похоже на Objective-C и некоторые другие языки. Вы должны явно объявить реализацию интерфейса.


Утиной Типизацией

то, на что вы намекаете, называется "утка-типирование" (по имени идиому "если оно выглядит как утка, и крякает как утка, то это утка").

С помощью duck-typing реализация интерфейса неявна, как только вы реализовали соответствующие члены (так же, как вы описываете), однако .NET в настоящее время не имеет широкой поддержки для этого.

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

в то же время, вы можете синтезировать УТК-печатать через отражение, с библиотека, подобная этой, что позволит вам сделать утку набранный бросок, как это:IDoo myDoo = DuckTyping.Cast<IDoo>(myFoo)

Некоторые Мелочи

интересно, что есть одно маленькое место, где Утиная печать используется в C# сегодня -foreach оператора. Кшиштоф Квалина государства это для того, чтобы быть перечисляемым foreach оператор, класс должен:

обеспечить метод getenumerator публичный метод который не принимает никаких параметров и возвращает тип, который имеет два элемента: a) метод MoveMext, который не принимает параметров и возвращать логическое значение, и Б) собственность Current с геттером, который возвращает Объект.

обратите внимание, что он не упоминает о IEnumerable, ни IEnumerator. Хотя это распространено для реализации этих интерфейсы при создании перечисляемого класса, если вы должны были удалить интерфейсы, но оставить реализацию, ваш класс все равно будет перечисляться foreach. Вуаля! Печатать утку! (код..)


при условии, что IDoo имеет каких-либо членов, этот код не скомпилируется. Если у IDoo нет членов, то да, бросок безопасен (но, очевидно, ограниченного использования).


Это в основном потребует ввода утки для работы на C#, что не происходит автоматически.

есть немного библиотеки это может сделать это, хотя.


public class A
{
   public void DoSomething();
}

public interface IDoSomething
{
   void DoSomething();
}

public class B : A, IDoSomething
{ }

B удовлетворяет IDoSomething.Сделать путем наследования от