Objective-c在C#中的__kindof

时间:2017-06-26 20:32:11

标签: c# objective-c xamarin.mac

我没有目标c的经验,我正在尝试将目标c中编写的课程翻译成c#。在目标C类中有“__kindof”关键字,例如

- (NSArray<__kindof NSViewController *> *)popToViewController:(__kindof NSViewController *)viewController animated:(BOOL)animated;

我研究了这个关键字,文档说它允许NSViewController的子类作为数组中的参数或元素传递。所以我想知道C#中是否有类似的东西。如果没有,我们是否允许只传递NSViewController的子类作为此方法的参数或NSArray的元素?

2 个答案:

答案 0 :(得分:0)

您主要通过继承Inheritance基类或实现abstract来讨论Interface。然后,您可以传入子类实例来代替基类。

如下所示:

public interface INSViewController { ... }

public class ChildNSViewController : INSViewController {... } 

//Your method definition

public IEnumerable<INSViewController> popToViewController(INSViewController arg) {... }

您现在可以使用子类型作为参数

来调用此方法
popToViewController(new ChildNSViewController())

答案 1 :(得分:0)

  

所以我想知道C#中是否有类似的东西。

不是这样的。有效地__kindof允许一个可能无法省略的强制转换 - 希望因为代码已经完成了测试而且知道它不会。

  
    

例如:如果YX的子类,并且您有X类型的变量,那么您可以测试它是否为Y,强制转换为{ {1}},并调用Y方法。如果变量具有类型Y,则可以省略强制转换步骤。然而,Objective-C不会静态地执行测试步骤,依赖运行时测试来捕获任何错误。

  

C#7的模式匹配功能可用于执行类似的操作,因为您可以测试(在__kindof Xif中)某些特定类型的内容并绑定名称作为那种类型 - 所以再次避免在测试后施放。与Objective-C功能不同,测试部分是必需的。

  

如果没有,我们是否允许只传递NSViewController的子类作为此方法的参数或NSArray的元素?

是。在您的C#代码中,您可能需要使用Objective-C中隐含的强制转换/ switch / is - 除非您偏好as并运行时间测试。

HTH