我正在考虑使用Swift 4的以下结构:
class BaseClass {
// abstract function
func doSomething<T: BaseClass>(with object: T) {}
}
class SubClass: BaseClass {
var title: String = "hello world"
// implementation
override func doSomething<T: BaseClass>(with object: T) {
// do something with object
// can I access object.title here?
}
}
在上面的代码段中,无法访问object.title
属性,因为显然object
属性的类型为BaseClass
,而不是SubClass
。
我假设函数参数类型应设置为Self
,例如:
func doSomething(with object: Self) {}
但编译时出现以下错误。
'Self' is only available in a protocol or as the result of a method in a class; did you mean 'BaseClass'?
有没有办法在从基类覆盖函数时引用self类型?
所以我的问题是我们是否可以在覆盖超类的函数的函数内访问SubClass
的属性(因为object.title
属性在SubClass
实现中) 。我正在考虑继承基类的很多类,所以我认为在调用时让函数与另一个具有相同类型的实例交互可能是有用的。
答案 0 :(得分:0)
你不能创建一个函数kike func doSomething(with object: Self) {}
,因为它会在这些类中表示不同的东西(因此,不会在语义上相互覆盖)
考虑使用BaseClass
对象调用子类,而不是Subclass
,如果您的代码片段中显示的方法与Self
类似,则可以通过supperclass,但是子类不再实现它了。
但是,你可以在子类中这样抛出它:
override func doSomething<T: BaseClass>(with object: T) {
guard let subClass = object as? SubClass else { return }
print("\(title): \(subClass.title)")
}