Swift 4泛型,引用self

3
我考虑使用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函数内像这样访问titleself.title - 3stud1ant3
函数参数不能像这样具有协变性。考虑一下如果可能的话;BaseClass 将会说你可以传递一个从 BaseClass 继承或是 BaseClass 的实例类型。SubClass 将会说你只能传递一个从 SubClass 继承或是 SubClass 的实例类型。这是里氏替换原则的明显违反,你可以将 SubClass 向上转型为 BaseClass,然后将一个期望符合 SubClass 实例的方法的 BaseClass 参数传递进去。 - Hamish
1个回答

0

你不能创建一个像这样的函数 func doSomething(with object: Self) {},因为它在这些类中意味着不同的事情(因此,在语义上不会相互覆盖)。

想想用一个不是SubclassBaseClass对象来调用子类,如果你有一个像你在代码片段中展示的那样带有Self的方法,它将由超类实现,但子类将不再实现它。

但是,在子类中可以像这样进行转换:

override func doSomething<T: BaseClass>(with object: T) {
    guard let subClass = object as? SubClass else { return }
    print("\(title): \(subClass.title)")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接