我考虑使用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' 只在协议中或作为类中方法的结果中可用;你是否想说 'BaseClass'?
在覆盖基类函数时,有没有办法引用 self 的类型?
编辑
所以我的问题是,我们是否可以在覆盖超类函数的函数内部访问 SubClass
的属性(如 object.title
属性在 SubClass
实现中)。我考虑了很多继承基类的类,所以我认为当调用时与具有相同类型的另一个实例交互的函数可能会很有用。
doSomething
函数内像这样访问title
:self.title
。 - 3stud1ant3BaseClass
将会说你可以传递一个从BaseClass
继承或是BaseClass
的实例类型。SubClass
将会说你只能传递一个从SubClass
继承或是SubClass
的实例类型。这是里氏替换原则的明显违反,你可以将SubClass
向上转型为BaseClass
,然后将一个期望符合SubClass
实例的方法的BaseClass
参数传递进去。 - Hamish