gpt4 book ai didi

函数类型中的快速子类

转载 作者:搜寻专家 更新时间:2023-11-01 07:26:40 25 4
gpt4 key购买 nike

有没有办法将参数为子类的函数分配给参数为父类(super class)的函数变量?这是我的意思的一个例子:

class ClassA {}

class subclassOfA:ClassA {}

func subclassToNil(argument:subclassOfA) -> (){}

var functionVariable:(ClassA->())

funcVar = subclassToNil

这会引发类型不兼容异常。

最佳答案

恐怕不是——您已经发现了“协变”和“逆变”。函数类型与其参数(arguments)是逆变的,这意味着您可以根据需要提供父类(super class),但不能提供子类。另一方面,对于返回值,函数类型是协变的,如果您愿意,可以返回一个子类

稍微想一想,这些规则是有道理的:

class ClassA {}

class SubclassOfA: ClassA {}

func subclassToNil(argument: SubclassOfA) -> ()) {}

var functionVariable: (ClassA -> ())

functionVariable = subclassToNil

functionVariable(ClassA()) //`subclassToNil` won't know what to do with this; kablooie!

但是:

class ClassParent {}

class ClassA: ClassParent {}

func subclassToNil(argument: ClassParent) -> ()) {}

var functionVariable:(ClassA -> ())

functionVariable = subclassToNil

functionVariable(ClassA()) //`ClassA()` is indeed a valid `ClassParent`, so we're fine.

因此使用不太具体的参数是安全的。返回值的推理非常相似,您会发现从逻辑上讲,您可以使用具体的返回值。

关于函数类型中的快速子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35671622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com