Ожидается ли поведение этого общедоступного, но абстрактного метода интерфейса?

Недавно я обнаружил (благодаря неработающему ядру 2.2), что теперь это разрешено в C# 8.

public interface ISimple
{
    public string Simon { get; }
}

ISimple это интерфейс, Simon не имеет реализации, но publicключевое слово разрешено.
Я это понимаюpublicсуществует для реализаций по умолчанию в интерфейсах, но это свойство не имеет реализации.

По сравнению с этим, чего, безусловно, следовало ожидать.

public interface ISimple
{
    public string Simon => "met a pie man";
}

Я сомневаюсь, что это недосмотр; если нет, то в чем смысл этого? Какая от этого польза?

1 ответ

Решение

Все глубже-глубже-глубже означает, что реальная мотивация модулей DIM - взаимодействие Xamarin/Android.

Android и Java используют модули DIM для управления версиями интерфейса. Приложение Android должно работать на десятках уровней Android SDK, а модули DIM используются для реализации по умолчанию приложений, которые были созданы для более старых версий SDK. Приложение Xamarin действительно выиграет, если сможет напрямую использовать или переопределять эти реализации.

Например, интерфейс LifeCycleObserver используется для уведомления приложений о конкретных событиях жизненного цикла. Приложения могут реализовать это, чтобы получать уведомления о событиях. Интерфейс DefaultLifeCycleObserver использует пустые методы по умолчанию для обеспечения реализации по умолчанию, поэтому приложениям не нужно обрабатывать все состояния. Можно было добавить новые состояния, и приложения вообще не пришлось бы менять:

/**
 * Callback interface for listening to {@link LifecycleOwner} state changes.
 * <p>
 * If you use Java 8 language, <b>always</b> prefer it over annotations.
 */
@SuppressWarnings("unused")
public interface DefaultLifecycleObserver extends FullLifecycleObserver {
    /**
     * Notifies that {@code ON_CREATE} event occurred.
     * <p>
     * This method will be called after the {@link LifecycleOwner}'s {@code onCreate}
     * method returns.
     *
     * @param owner the component, whose state was changed
     */
    @Override
    default void onCreate(@NonNull LifecycleOwner owner) {
    }

Android-DisposeBag отменяет реализацию этого по умолчанию распоряжаться ReactiveJava потоков только тогда, когда приложение остановится или не выключается:

class DisposeBag @JvmOverloads constructor(owner: LifecycleOwner,
                                           private val event: Lifecycle.Event = DisposeBagPlugins.defaultLifecycleDisposeEvent)
    : Disposable, DisposableContainer, DefaultLifecycleObserver {

...

    override fun onPause(owner: LifecycleOwner) {
        if (event == Lifecycle.Event.ON_PAUSE) dispose()
    }

    override fun onStop(owner: LifecycleOwner) {
        if (event == Lifecycle.Event.ON_STOP) dispose()
    }

    override fun onDestroy(owner: LifecycleOwner) {
        if (event == Lifecycle.Event.ON_DESTROY) dispose()
    }

Я не удивлюсь, если в пакете SDK для Azure начнутся модули DIM. Это могло бы объяснить, почему Скотт Хантер продолжал говорить оmodern cloud environments при описании модулей DIM во время выступления на конференции.NET Conf.

Другие вопросы по тегам