这是 public - 但抽象 - 接口方法的预期行为吗?
Is this public - but abstract - interface method expected behavior?
我最近发现(由于针对核心 2.2 的构建已损坏)现在这在 C# 8 中是合法的
public interface ISimple
{
public string Simon { get; }
}
ISimple
是一个接口,Simon
没有实现,但是public
关键字是允许的。
我知道 public
是为了 Default Implementations in Interfaces 但这个 属性 没有实现。
比起这个,这绝对是意料之中的事情
public interface ISimple
{
public string Simon => "met a pie man";
}
我怀疑这是一个疏忽;如果不是,那么这样做的理由是什么?它有什么用?
更深更深的含义是 DIM 背后的真正 动机是 Xamarin/Android 互操作。
Android 和 Java 使用 DIM 进行接口版本控制。 Android 应用程序必须在数十个 Android SDK 级别上工作,DIM 用于为为旧版 SDK 构建的应用程序提供默认实现。如果 Xamarin 应用程序可以直接使用或覆盖这些实现,那么它会 真正 受益。
例如 LifeCycleObserver interface is used to notify applications for specific lifecycle events. Applications can implement this to get notified of events. The DefaultLifeCycleObserver 接口使用 empty 默认方法来提供默认实现,因此应用程序不必处理 all 状态。可以添加新状态并且应用程序根本不需要更改:
/**
* 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()
}
如果 Azure SDK 开始使用 DIM,我不会感到惊讶。这可以解释为什么 Scott Hunter 在 .NET Conf 主题演讲中描述 DIM 时一直谈论 modern cloud environments
。
我最近发现(由于针对核心 2.2 的构建已损坏)现在这在 C# 8 中是合法的
public interface ISimple
{
public string Simon { get; }
}
ISimple
是一个接口,Simon
没有实现,但是public
关键字是允许的。
我知道 public
是为了 Default Implementations in Interfaces 但这个 属性 没有实现。
比起这个,这绝对是意料之中的事情
public interface ISimple
{
public string Simon => "met a pie man";
}
我怀疑这是一个疏忽;如果不是,那么这样做的理由是什么?它有什么用?
更深更深的含义是 DIM 背后的真正 动机是 Xamarin/Android 互操作。
Android 和 Java 使用 DIM 进行接口版本控制。 Android 应用程序必须在数十个 Android SDK 级别上工作,DIM 用于为为旧版 SDK 构建的应用程序提供默认实现。如果 Xamarin 应用程序可以直接使用或覆盖这些实现,那么它会 真正 受益。
例如 LifeCycleObserver interface is used to notify applications for specific lifecycle events. Applications can implement this to get notified of events. The DefaultLifeCycleObserver 接口使用 empty 默认方法来提供默认实现,因此应用程序不必处理 all 状态。可以添加新状态并且应用程序根本不需要更改:
/**
* 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()
}
如果 Azure SDK 开始使用 DIM,我不会感到惊讶。这可以解释为什么 Scott Hunter 在 .NET Conf 主题演讲中描述 DIM 时一直谈论 modern cloud environments
。