我没有目标c的经验,我正在尝试将目标c中编写的课程翻译成c#。在目标C类中有“__kindof”关键字,例如
- (NSArray<__kindof NSViewController *> *)popToViewController:(__kindof NSViewController *)viewController animated:(BOOL)animated;
我研究了这个关键字,文档说它允许NSViewController的子类作为数组中的参数或元素传递。所以我想知道C#中是否有类似的东西。如果没有,我们是否允许只传递NSViewController的子类作为此方法的参数或NSArray的元素?
答案 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
允许一个可能无法省略的强制转换 - 希望因为代码已经完成了测试而且知道它不会。
例如:如果
Y
是X
的子类,并且您有X
类型的变量,那么您可以测试它是否为Y
,强制转换为{ {1}},并调用Y
方法。如果变量具有类型Y
,则可以省略强制转换步骤。然而,Objective-C不会静态地执行测试步骤,依赖运行时测试来捕获任何错误。
C#7的模式匹配功能可用于执行类似的操作,因为您可以测试(在__kindof X
或if
中)某些特定类型的内容并绑定名称作为那种类型 - 所以再次避免在测试后施放。与Objective-C功能不同,测试部分是必需的。
如果没有,我们是否允许只传递NSViewController的子类作为此方法的参数或NSArray的元素?
是。在您的C#代码中,您可能需要使用Objective-C中隐含的强制转换/ switch
/ is
- 除非您偏好as
并运行时间测试。
HTH