将函数参数参数限制为基数 class in Swift
Limit function parameter argument to base class in Swift
假设以下设置:
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) { }
希望我没有让大家更加困惑,但是 "infix operator" 部分和 BaseClass
是通用 BaseClass<T>
这一事实对于这个问题来说并不重要。 .
您无法阻止在 编译器 级别用子类实例替换超类实例,正如您正在尝试做的那样,因为该替换是 基础 多态性本身。
当然,如果参数的 dynamicType
不是超类,您当然可以在运行时 随意抛出一个摇摆不定的 :
func doSomething(arg: BaseClass) {
if !(arg.dynamicType === BaseClass.self) {
fatalError("die die die")
}
println("ok")
}
假设以下设置:
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) { }
希望我没有让大家更加困惑,但是 "infix operator" 部分和 BaseClass
是通用 BaseClass<T>
这一事实对于这个问题来说并不重要。 .
您无法阻止在 编译器 级别用子类实例替换超类实例,正如您正在尝试做的那样,因为该替换是 基础 多态性本身。
当然,如果参数的 dynamicType
不是超类,您当然可以在运行时 随意抛出一个摇摆不定的 :
func doSomething(arg: BaseClass) {
if !(arg.dynamicType === BaseClass.self) {
fatalError("die die die")
}
println("ok")
}