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.Сделать путем наследования от