我最近发现(由于针对核心 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";
}
我怀疑这是一个疏忽;如果不是,这样做的理由是什么?它有什么用?
更深层次的含义是,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()
}
如果AzureSDK 开始使用 DIM,我不会感到惊讶。这可以解释为什么 Scott Hunter 在 .NET Conf 主题演讲中描述 DIM 时一直在谈论modern cloud environments
。