是否可以从基类中获取实际的类类型?

时间:2020-09-09 20:01:09

标签: c#

在过去的几年中在Swift中工作之后,重新访问了一些旧的C#8代码,并且遇到了麻烦。好吧,反正一个烦人的减速带。

Swift具有出色的语言功能,其中类型Self始终引用实例化类型,即使您在基类中(尽管在基类中,您仍然只能访问基类成员) )。这意味着,如果您拥有类型为Self的函数或属性,它将始终是调用站点上的实例化类型。

这是一个示例。不确定是否可以在我打字的时候编译,但是您明白了。

abstract class Foo {

    public Foo ReturnMe(){ // Note the return type 'Foo'
        return this;
    }
}

class Laa : Foo {}
var laa = new Laa();
var x = laa.ReturnMe(); // x is of type 'Foo', not of type 'Laa'

但是,通过将ReturnMe的返回类型更改为Self,会发生一些神奇的事情...
(当然,不会编译。这仅是说明性的。)

abstract class Foo {

    public Self ReturnMe(){ // Note the return type 'Self' here, not 'Foo' as before
        return this;
    }
}

class Laa : Foo {}
var laa = new Laa();
var y = laa.ReturnMe(); // 'y' here is type 'Laa' not 'Foo' thanks to 'Self'

class Hee : Foo {}
var hee = new Hee();
var z = hee.ReturnMe(); // Like above, 'z' here is type 'Hee'

此功能非常有用,因为它使您可以轻松创建可链接的,流畅的界面,而不会丢失类型。例如,您可以执行此操作...

x.doSomething().thenSomethingMore().andEvenmore();

即使这些方法都是在基类中定义的,无论类型x是向下传递的类型,这意味着所有基类和子类成员都将可用,而不仅仅是基类中的那些成员。

那么,C#8是否有任何这样的机制?

0 个答案:

没有答案