- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个通用类的形式:
class BaseClass<T> {
var prop: T
...
}
然后我有多个形式的子类:
class SubClassOne: BaseClass<SomeSubClass> {
...
}
class SubClassTwo: BaseClass<SomeOtherSubClass> {
...
}
参数所在的类型SomeSubClass
和 SomeOtherSubClass
都继承自一个公共(public)基类 SomeBaseClass
.
我现在想定义一个变量来存储 SubClassOne
的实例和 SubClassTwo
.我尝试了很多可能性:
var obj: BaseClass
var obj: BaseClass<SomeBaseClass>
var obj: BaseClass<Any>
但第一次尝试导致错误 Reference to generic type 'BaseClass' requires arguments in <...>
,另外两个导致错误 Cannot assign value of type 'SubClassOne' to type ...
尝试分配值时。我什至试图通过初始化数组来欺骗 Swift 编译器为我推断类型:
var testArray = [SubClassOne(), SubClassTwo()]
但即使这样也失败了,导致错误 Heterogeneous collection literal could only be inferred to [Any]; add explicit type annotation if this is intentional
.实际上,唯一成功允许存储两个子类的类型注释是 Any
或 AnyObject
.是否可以将这些实例存储为更具体的类型?如果不是,为什么?
这样做很重要的原因是我最终想要获得属性(property) prop
来自存储的变量 obj
.如果 obj
我无法这样做存储为 Any
.我也无法简单地将其转换为 SubClassOne
或 SubClassTwo
因为我尝试访问属性的方法本身是一个通用方法,SubClassOne
中的哪个或 SubClassTwo
转换为取决于方法的泛型类型参数:
func castObj<T>(asType: T.Type) {
(self.obj as? T).prop
}
这将被称为:castObj(asType: SubClassOne.self)
或 castObj(asType: SubClassTwo.self)
.但是,我们遇到了同样的问题:我可以定义的唯一泛型类型参数约束同时接受 SubClassOne
。和 SubClassTwo
是Any
,然后 Swift 编译器会报错:Value of type 'T' has no member 'prop'
.
作为解决方法,我尝试定义一个封装所需属性的协议(protocol):
protocol HasProp {
var prop: SomeBaseClass { get }
}
然后我将其添加到 SubClassOne
的声明中和 SubClassTwo
.然而,这导致了另一个错误:Type 'SubClassOne' does not conform to protocol 'HasProp'
.这也让我感到困惑,因为 SubClassOne
和 SubClassTwo
都继承 prop
来自 BaseClass<SomeSubClass>
因此实际上确实符合协议(protocol)。
总结:
SubClassOne
的实例?和 SubClassTwo
具有更具体的类型,可以访问 BaseClass
的属性?如果不是,为什么?最佳答案
问题是目前函数 castObj
对其泛型参数 T
没有类型限制。通过提供 BaseClass
的类型约束,您应该没问题,因为 BaseClass
具有这两个属性。
func castObj<T: BaseClass>(asType: T.Type) {
(self.obj as? T).propOne
(self.obj as? T).propTwo
}
关于swift - Swift 中的继承、泛型和协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45617313/
我是一名优秀的程序员,十分优秀!