Swift 4泛型,引用自我

时间:2017-09-20 03:56:31

标签: swift generics inheritance subclass self

我正在考虑使用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实现中) 。我正在考虑继承基类的很多类,所以我认为在调用时让函数与另一个具有相同类型的实例交互可能是有用的。

1 个答案:

答案 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)")
}