gpt4 book ai didi

swift - Swift 中的继承、泛型和协议(protocol)

转载 作者:搜寻专家 更新时间:2023-11-01 05:34:08 24 4
gpt4 key购买 nike

我有一个通用类的形式:

class BaseClass<T> {
var prop: T
...
}

然后我有多个形式的子类:

class SubClassOne: BaseClass<SomeSubClass> {
...
}

class SubClassTwo: BaseClass<SomeOtherSubClass> {
...
}

参数所在的类型SomeSubClassSomeOtherSubClass都继承自一个公共(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 .实际上,唯一成功允许存储两个子类的类型注释是 AnyAnyObject .是否可以将这些实例存储为更具体的类型?如果不是,为什么?

这样做很重要的原因是我最终想要获得属性(property) prop来自存储的变量 obj .如果 obj 我无法这样做存储为 Any .我也无法简单地将其转换为 SubClassOneSubClassTwo因为我尝试访问属性的方法本身是一个通用方法,SubClassOne 中的哪个或 SubClassTwo转换为取决于方法的泛型类型参数:

func castObj<T>(asType: T.Type) {
(self.obj as? T).prop
}

这将被称为:castObj(asType: SubClassOne.self)castObj(asType: SubClassTwo.self) .但是,我们遇到了同样的问题:我可以定义的唯一泛型类型参数约束同时接受 SubClassOne。和 SubClassTwoAny ,然后 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' .这也让我感到困惑,因为 SubClassOneSubClassTwo都继承 prop来自 BaseClass<SomeSubClass>因此实际上确实符合协议(protocol)。

总结:

  1. 是否可以存储 SubClassOne 的实例?和 SubClassTwo具有更具体的类型,可以访问 BaseClass 的属性?如果不是,为什么?
  2. 为什么子类不符合预期的协议(protocol)?
  3. 如何更改设计以获得我想要的行为?

最佳答案

问题是目前函数 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/

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