【发布时间】:2023-03-20 10:47:01
【问题描述】:
在 Swift 中,我想让我的基类静态方法在从子类调用静态方法时返回其子类对象。
当返回一个子类对象时,我可以通过使用 init() 来实现。 但是当返回多个子类对象时,就不能使用init()了。
而我不仅要从父静态方法返回子类对象,还要在父静态方法中实现一些除实例化以外的逻辑,让每个子类的静态方法继承父静态方法的行为。
我有 3 个子类。所以,我不想在3个子类的静态方法中写相同的代码。 我该怎么办?
如果可能,我也想使用静态方法而不是 init() 来返回单个子类对象。
class Base {
func f() {
print("base class")
}
// this does not works. it creates a base class object.
static func createSubclassObject() -> Base {
return Base()
}
// this works. it creates a subclass object.
init() {
}
// this does not work. base class objects are created.
static func createSubclassObjects(count: Int) -> [Base] {
var objects = [Base]()
for _ in 0 ..< count {
objects.append(Base())
}
return objects
}
/* probably I need something like this. but this code generates a compile error
static func createSubclassObjects(count: Int) -> [Self] {
var objects = [Self]()
for _ in 0 ..< count {
objects.append(Self())
}
return objects
}
*/
// generic also does not work. this returns a base class object.
static func createSubclassObjectByGeneric<T: Base>() -> T {
return T()
}
}
class Sub: Base {
override func f() {
print("sub class")
}
}
print(Sub().f())
// sub class・
print(Sub.createSubclassObject().f())
// base class
Sub.createSubclassObjects(count: 2).forEach {
print($0.f())
}
// base class
// base class
print(Sub.createSubclassObjectByGeneric().f())
// base class
【问题讨论】:
标签: swift