C# и интерфейсы - явный по сравнению с неявным

Хотя я не знаю, что сделал Spring Framework и почему, я могу показать вам, как анализировать вашу строку в простой Java:

    DecimalStyle defaultDecimalStyle
            = DateTimeFormatter.ISO_LOCAL_DATE.getDecimalStyle();
    DateTimeFormatter arabicDateFormatter = DateTimeFormatter.ISO_LOCAL_DATE
            .withDecimalStyle(defaultDecimalStyle.withZeroDigit('\u0660'));

    String encodedArabicDateStr = "%D9%A2%D9%A0%D9%A1%D9%A9-%D9%A0%D9%A4-%D9%A1%D9%A5";
    String arabicDateStr
            = URLDecoder.decode(encodedArabicDateStr, StandardCharsets.UTF_8);
    LocalDate date = LocalDate.parse(arabicDateStr, arabicDateFormatter);
    System.out.println("Parsed date: " + date);

Вывод из этого фрагмента :

Дата анализа: 2019-04-15

Единственная хитрость заключается в том, чтобы сообщить форматировщику, чтобы он анализировал арабские цифры. Когда мы сообщаем ему нулевую цифру (٠ или '\u0660'), она вычисляет другие цифры.

10
задан Mehrdad Afshari 24 April 2009 в 22:21
поделиться

5 ответов

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

12
ответ дан 3 December 2019 в 14:00
поделиться

Duck Typing

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

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

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

В то же время вы можете синтезировать типизацию утки с помощью рефлексии с помощью такой библиотеки, как эта , который позволил бы вам выполнять приведение типа утки, например, так: IDoo myDoo = DuckTyping.Cast (myFoo)

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

Интересно, что есть одно небольшое место, где набирается утка используется в C # сегодня - оператор foreach . Кшиштоф Квалина утверждает , что для того, чтобы его можно было перечислить оператором foreach , который не принимает параметров и возвращает тип с двумя членами: а) метод MoveMext, который не принимает параметров и вернуть логическое значение, и б) свойство Ток с геттером, который возвращает Object.

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

17
ответ дан 3 December 2019 в 14:00
поделиться

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

4
ответ дан 3 December 2019 в 14:00
поделиться

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

Однако есть некоторые библиотеки , которые могут это делать.

3
ответ дан 3 December 2019 в 14:00
поделиться
public class A
{
   public void DoSomething();
}

public interface IDoSomething
{
   void DoSomething();
}

public class B : A, IDoSomething
{ }

B удовлетворяет IDoSomething.DoSomething, наследуя от A

2
ответ дан 3 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: