gpt4 book ai didi

swift - 将函数参数参数限制为 Swift 中的基类

转载 作者:搜寻专家 更新时间:2023-10-31 23:03:41 28 4
gpt4 key购买 nike

假设以下设置:

class BaseClass<T> { }

class SubClass<T>: BaseClass<T> { }

infix operator >-- { associativity left }

func >-- <T>(lhs: BaseClass<T>, rhs: SubClass<T>) {
// do something here
}

我正在寻找的是一种排除 SubClass 的方法从被用作 lhs与运算符的争论​​ >-- .这将是对通用参数的负类型约束——即 T: BaseClass where T != Subclass :

func >-- <T, B: BaseClass<T> where B != SubClass<T>>(lhs: B, rhs: SubClass<T>)

但是好像没有!=您可以作为泛型的否定类型约束提供的参数。有办法做到这一点吗?

谢谢!

编辑:

我想我实际上可以让问题变得不那么复杂 - 我认为以下设置会遇到完全相同的问题,但没有一些分散注意力的细节:

class BaseClass { }
class SubClass: BaseClass { }

// This is what I want to be able to do, but don't know how
// or if it is possible:
func doSomething<B: BaseClass where B != SubClass>(arg: B) { }

希望我不只是让大家更加困惑,而是“中缀运算符”部分和 BaseClass 的事实是一个通用的 BaseClass<T>对这个问题来说并不重要......

最佳答案

您无法阻止在编译器 级别将子类实例替换为父类(super class)实例,正如您正在尝试做的那样,因为该替换是多态性本身的基础。 p>

当然,如果参数的 dynamicType 不是父类(super class),您当然可以在运行时抛出一个不稳定的消息:

func doSomething(arg: BaseClass) {
if !(arg.dynamicType === BaseClass.self) {
fatalError("die die die")
}
println("ok")
}

关于swift - 将函数参数参数限制为 Swift 中的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29853574/

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