如何在Objective C 2.0中获得C#中的可选接口方法实现?

use*_*291 2 .net c# objective-c

Objective C具有协议,它是C#中接口的等价物.然而,C#强制实现Objective C 1.0中的所有方法.

但是在Objective C 2.0中,现在可以将协议中的某些方法标记为可选.C#允许这样做还是将来允许这样做?

理论上,强制执行是接口的目的,但实际上我在复杂项目中遇到了这个硬规则的负担:你必须创建许多很难管理设计或重构的接口.所以对我来说,Objective C 1.0到Objective C 2.0的演变确实很有意义.

由于微软通常务实,如果他们也能做到这一点会很棒.

Ant*_*ram 6

你可以来的最接近的是一个显式的实现(因此该方法不是公开可见的API的一部分),然后更进一步,以防万一有人找到它并尝试使用它.

void ICanDoSomething.DoSomething()
{
    throw new NotSupportedException(); // optional
}
Run Code Online (Sandbox Code Playgroud)

当某人实例化实现该接口的对象时,除非他们将该对象称为接口,否则他们将看不到显式实现.

BCL的一个例子是一个实现的数组ICollection<T>.ICollection<T>有一个Add对固定长度数组无用的方法.对于数组,它是一个显式实现,如果你尝试使用它,它将抛出.

int[] array = { 1, 2, 3 };
ICollection<int> collection = (ICollection<int>)array;
collection.Add(4); // throws NotSupportedException
Run Code Online (Sandbox Code Playgroud)

当然,如果你可以避免一些"可选"行为,那么最好这样做.例如,将其拆分为多个接口,因此类只实现实际需要的行为的接口.