【发布时间】:2018-02-28 23:34:57
【问题描述】:
我正在考虑使用 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?
}
}
在上面的 sn-p 中,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 实现中)。我正在考虑很多继承基类的类,所以我认为让函数在调用时与具有相同类型的另一个实例交互可能很有用。
【问题讨论】:
-
我认为你不能访问基类对象的子类属性,你可以像这样访问
titleself.titleinsidedoSomething -
你不能有像函数参数那样的协方差。考虑是否可能;
BaseClass会说你可以传入一个继承自BaseClass或者是BaseClass的类型的实例。然后SubClass会说您实际上可以仅 传入一个继承自SubClass或者是SubClass的类型的实例。这明显违反了 Liskov 替换原则,您可以将SubClass向上转换为BaseClass,然后将BaseClass参数传递给期望实例符合SubClass的方法。
标签: swift generics inheritance subclass self